一、Fragment生命周期函数
1、当Fragment第一次依附于它所属的activity时自动调用的方法
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
}
2、当Fragment被创建时做初始化操作时自动调用的方法
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
3、当Fragment实例化它的用户界面时自动调用的方法,如果当前Fragment没有用户界面则返回null
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.fragment_fragment_life_cycler, container, false);
return view;
}
4、当Fragment所依附的Activity的onCreate()方法执行完毕后自动调用的方法
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
5、当Fragment对用户可见时自动调用的方法
@Override
public void onStart() {
super.onStart();
}
6、当Fragment获取焦点时自动调用的方法
@Override
public void onResume() {
super.onResume();
}
7、当Fragment失去焦点时自动调用的方法
@Override
public void onPause() {
super.onPause();
}
8、当Fragment对用户不可见时自动调用的方法
@Override
public void onStop() {
super.onStop();
}
9、当之前通过onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState)创建的用户界面被销毁时自动调用的方法
@Override
public void onDestroyView() {
super.onDestroyView();
}
10、当Fragment不再被使用(销毁)时自动调用的方法
@Override
public void onDestroy() {
super.onDestroy();
}
11、当Fragment不再依附于他所属的Activity时自动调用的方法
@Override
public void onDetach() {
super.onDetach();
}
二、动态的添加,修改和删除Fragment
Activity的回退栈是由系统管理的,
Fragment的回退栈是有它所属的Activity管理的.
1、声明碎片管理器对象
private FragmentManager fragmentManager;
2、得到碎片管理器对象
this.fragmentManager=this.getFragmentManager();
3、添加碎片
同一个容器中只能添加相同Fragment对象一次,如果对象的引用地址相同,重复添加会报错:
java.lang.IllegalStateException: Fragment already added: DetailFragment{534da41c #0 id=0x7f0c0053}
- 通过碎片管理器对象得到碎片事务对象
FragmentTransaction fragmentTransaction=this.fragmentManager.beginTransaction();
- 实例化详情Fragment 对象
DetailFragment detailFragment=new DetailFragment();
- 将详情Fragment添加到linearLayout_content容器中
fragmentTransaction.add(R.id.linearLayout_content,detailFragment);
- 添加当前事务操作到回退栈中,之后可以依次将碎片从回退栈中弹出
注意:要想让下面的代码生效,则必须让当前Activity继承Acivity,不要继承他的其它子类,避免出错
fragmentTransaction.addToBackStack(null);//null:表示使用系统生成的回退栈的名称
- 提交事务的操作
fragmentTransaction.commit();
4、修改碎片
- 通过碎片管理器对象得到碎片事务对象
FragmentTransaction fragmentTransaction=this.fragmentManager.beginTransaction();
- 如果之前不存在Fragment则直接添加,如果存在则先删除之前的Fragment在添加新的Fragment
fragmentTransaction.replace(R.id.linearLayout_content,new SecondFragment());
- 提交事务的操作
fragmentTransaction.commit();
5、删除碎片
- 通过碎片管理器对象得到碎片事务对象
FragmentTransaction fragmentTransaction=this.fragmentManager.beginTransaction();
- 删除碎片对象,根据对象的引用地址判断是否是同一个碎片对象
fragmentTransaction.remove(detailFragment);
- 提交事务的操作
fragmentTransaction.commit();
三、Fragment中的传值
一)、Activity与Fragment
1、Activity传值到Fragment
-
a、动态添加Fragment同时调用 fragment的myFragment.setArguments(bundle)传值到Fragment并
在Fragment中使用Bundle bundle=this.getArguments()获取值 -
b、通过FragmentManager查找添加过的Fragment并通过调用 fragment.getView()的View对象进而查找控件并赋值或者通过给fragment添加setter函数传值到 fragment.
2、Fragment传值到Activity
-
a、通过得到Fragment所依附的Activity并给Activity提供 setter函数传值到Activity或者让Activity实现传
值的接口来完成. -
b、得到Fragment所依附的Activity并通过findViewById()查找控件并赋值
二)、Fragment传值到Fragment
- 在一个fragment中得到FragmentManager并查找另一个Fragment之后通过setter函数或者getView()方
法得到View查找控件并赋值.
由于两个Fragment在添加到当前Activity时使用的是同一个碎片管理器对象,因此可以通过碎片管理器对象查找另一个碎片对象
RightFragment rightFragment= (RightFragment) getFragmentManager().findFragmentById(R.id.fragment_right);
三)、万能的接口回调(适合所有的传值方式)
1.自定义传值接口
public interface PassValue{
void setValue(String value);
}
2.声明接口类型的对象
private PassValue passValue;
3.给接口类型的对象提供setter函数
public void setPassValue(PassValue passValue) {
this.passValue = passValue;
}
4.在传值的目标端(RightFragment)调用setter函数
LeftFragment leftFragment= (LeftFragment) getFragmentManager().findFragmentById(R.id.fragment_left);
leftFragment.setPassValue(new LeftFragment.PassValue() {
@Override
public void setValue(String value) {
textView_content.setText(value);
System.out.println("===setValue(String value="+value+")====");
}
});