一、生命周期
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;
}
}
}