fragment
一、生命周期
1、onAttach():当Fragment被添加到Activity中时被回调,该方法只被调用一次
2、onCreate(Bundle saveStatus): 创建Fragment时调用,该方法只被调用一次
3、onCreateView(): 每次创建,绘制该fragment的View组件时调用该方法,返回的View组件
4、onActivityCreate();所在的活动创建完成后调用该方法
5、onStart()启动Fragment时被调用
6、onResume():恢复fragment时调用
7、onPause():暂停时调用
8、onDestroyView():销毁fragment中的View时,该方法时调用
9、onDestroy():销毁frgment时调用
10、onDetach()frgment从活动中删除时调用
开发时根据需要有选择地实现一些方法,其中onCreateView()方法是最常见的方法。
二、其中fragment作为Activity的组成部分,Fragment可以调用getActivity()方法获取它所在的Activity。
在Activity中也可以通过FrgmentManager的findFragmentById()或者findFragmentByTag()方法来获取Fragment。
在Activity运行过程中,可以调用FrgmentManager获得FragmentTransaction对象,FragmentTransaction调用add(),remove(),replace()方法动态地添加,删除,替换Fragment。
一个Activity可以同时组合多个Fragment,同样一个Fragment也可以被多个Activity复用。
Fragment向Activity通信,还可在Fragment中定义一个回调接口,在Activity中实现该回调接口。
三、通常来说创建Fragment需要实现如下地三个方法
1、onCreate():系统创建Fragment对象时,回调该方法,可初始化fragment中保持必要地组件
2、onCreateView():当Fragment绘制界面组件时会调用方法,该方法必须返回一个view,该view就是Fragment所显示的View
3、onPause():当用户离开Fragment时将回调该方法
四、Fragment管理,Fragment事物
1、Activity管理Fragment主要通过FragmentManager。(在java中用getFragmentManager()方法获得FragmentManager),主要功能有如下:
1.1、findFragmentById()、findFragmentByTag()方法来获取Fragment。
1.2、popBackStack()方法从后台栈中将Fragment弹出
1.3、调用addOnBackStackChangeListener()注册一个监听器,监听后台栈的变化
2、如果想要实现添加,删除,替换Fragment,则需要借助Fragment事物(FragmentTransaction对象),想要Activity对Fragment的多个改变,其是通过FragmentTransaction(fragmentManager.beginTransaction()方法获得),最后用commit()方法提交事务。
五、Fragment可以有两种使用方法
1、直接在xml中间使用,当view使用
<fragment android:layout_width="wrap_content" android:layout_height="wrap_content" android:name="com.example.asus.summary.LeftFragement" //name为类名 android:id="@+id/left"/>
2、可在java代码中使用
左右Fragment的动态交换(实例)
2.1、xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/change" android:text="change" android:layout_gravity="center"/> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <FrameLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:id="@+id/left_f"/> <FrameLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:id="@+id/right_f"/> </LinearLayout> </LinearLayout>
2.2left_fragment.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/left_recyclerview" /> </LinearLayout>
2.3right_fragment.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/rigth_recyclerview" /> </LinearLayout>
2.4LeftFragment.java
public class LeftFragement extends Fragment { private List<Fruit> fruits=new ArrayList<>(); public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle saveInstanceState){ init(); View view=inflater.from(container.getContext()).inflate(R.layout.left_fragment,container,false); //加载出来的view为界面显示的View //加载view里面的组件 RecyclerView left=view.findViewById(R.id.left_recyclerview); LinearLayoutManager layoutManager=new LinearLayoutManager(container.getContext()); left.setLayoutManager(layoutManager); FruitRecyclerViewAdapter adapter=new FruitRecyclerViewAdapter(fruits); left.setAdapter(adapter); return view; } private void init() { fruits.add(new Fruit("pingguo", R.drawable.apple)); fruits.add(new Fruit("li", R.drawable.li)); fruits.add(new Fruit("xiaojiao", R.drawable.blan)); fruits.add(new Fruit("li", R.drawable.li)); fruits.add(new Fruit("pingguo", R.drawable.apple)); fruits.add(new Fruit("li", R.drawable.li)); fruits.add(new Fruit("pingguo", R.drawable.apple)); fruits.add(new Fruit("li", R.drawable.li)); fruits.add(new Fruit("sz", R.drawable.sz)); fruits.add(new Fruit("li", R.drawable.li)); } }
2.5RightFragment.java
public class RightFragment extends Fragment { private List<Fruit> fruits2=new ArrayList<>(); public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle saveInstanceState){ init(); View view=inflater.from(container.getContext()).inflate(R.layout.right_fragment,container,false); //加载出来的view为界面显示的View //加载view里面的组件 RecyclerView right=view.findViewById(R.id.rigth_recyclerview); LinearLayoutManager layoutManager2=new LinearLayoutManager(container.getContext()); right.setLayoutManager(layoutManager2); FruitRecyclerViewAdapter adapter2=new FruitRecyclerViewAdapter(fruits2); right.setAdapter(adapter2); return view; } private void init(){ fruits2.add(new Fruit("li",R.drawable.li)); fruits2.add(new Fruit("xiaojiao",R.drawable.blan)); fruits2.add(new Fruit("pingguo",R.drawable.apple)); fruits2.add(new Fruit("sz",R.drawable.sz)); fruits2.add(new Fruit("li",R.drawable.li)); fruits2.add(new Fruit("li",R.drawable.li)); fruits2.add(new Fruit("li",R.drawable.li)); fruits2.add(new Fruit("li",R.drawable.li)); } }
2.6实现Fruit.java和FruitRecyclerViewAdapter.java适配器
public class Fruit { private String name; private int imageId; public Fruit(String name, int imageId) { this.name = name; this.imageId = imageId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getImageId() { return imageId; } public void setImageId(int imageId) { this.imageId = imageId; } }
public class FruitRecyclerViewAdapter extends RecyclerView.Adapter<FruitRecyclerViewAdapter.ViewHolder> { private List<Fruit> fruitList; private Context context; public FruitRecyclerViewAdapter(List<Fruit> fruitList) { this.fruitList = fruitList; } public class ViewHolder extends RecyclerView.ViewHolder{ //将View组件和xml中的绑定 ImageView fruitImage; TextView fruitName; public ViewHolder(View itemView) { super(itemView); fruitImage=itemView.findViewById(R.id.fruitImage); fruitName=itemView.findViewById(R.id.fruitName); } } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if(parent!=null){ context=parent.getContext(); } View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.fruit_item,parent,false); //该view为每一个Fruit的View return new ViewHolder(view); } @Override public void onBindViewHolder(ViewHolder holder, int position) { //将每一个viewHolder添加信息 final Fruit fruit=fruitList.get(position); holder.fruitName.setText(fruit.getName()); holder.fruitImage.setImageResource(fruit.getImageId()); holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(context,fruit.getName(),Toast.LENGTH_SHORT).show(); } }); } @Override public int getItemCount() { //返回个数 return fruitList.size(); } }
2.7MainActivity.java
public class FragmentActivity extends AppCompatActivity implements View.OnClickListener{ private int tage=0; protected void onCreate(Bundle saveInstanceState) { super.onCreate(saveInstanceState); setContentView(R.layout.fragemnt_activity); Button change=findViewById(R.id.change); change.setOnClickListener(this); replace_left(new LeftFragement()); replace_right(new RightFragment()); } private void replace_left(Fragment fragment){ //获取Fragment管理FragmentManager FragmentManager fragmentManager=getSupportFragmentManager(); //获取Fragment事物FragmentTransaction FragmentTransaction transaction=fragmentManager.beginTransaction(); //FragmentTransaction调用替换 transaction.replace(R.id.left_f, fragment); //提交事务 transaction.commit(); } private void replace_right(Fragment fragment){ FragmentManager fragmentManager=getSupportFragmentManager(); FragmentTransaction transaction=fragmentManager.beginTransaction(); transaction.replace(R.id.right_f, fragment); transaction.commit(); } @Override public void onClick(View view) { switch (view.getId()){ case R.id.change:{ tage++; if(tage%2==0){ replace_left(new LeftFragement()); replace_right(new RightFragment()); }else{ replace_left(new RightFragment()); replace_right(new LeftFragement()); } break; } default: break; } } }