fragment是什么
fragment故名思意是碎片的意思,fragment必须依附在activity上,一个activity可以由多个fragment组成,fragment就相当于一个依附在activity上层的一个子布局,它可以加载自己的布局文件,activity可以动态地加载,替换,移除,隐藏,显示fragment
fragment生命周期
fragment有自己的生命周期,但它的生命周期依赖于它所依附的那个activity的生命周期,fragment可以接受处理用户事件,可以把平时写在activity中的事件处理剥离到fragment类中。
图片来自http://blog.csdn.net/lmj623565791/article/details/37970961
简单描述一下fragment的加载过程:
1.activity先完成created,然后就转到fragment生命周期的created阶段了,然后回调onAttach()一系列回调方法,
然后转到activity中,回调onStrat(),再回掉fragment 同一生命周期阶段的回调,到最后fragment显示出来。
2.加载的过程是先完成activity的回调,再去完成fragment的回调,销毁的过程则相反。比如,销毁带有fragment的activity时,先回调fragment的onPaus()方法,再到activity的。
3.当一个fragment被动态remove或者replace时,执行到onDestroyView时,如果fragment添加了回退栈,则fragment就会被添加的回退栈中,如果没有回退栈,fragment对象则会被销毁。从回退栈中弹出来重新显示的fragment是从生命周期的onActivityCreate处开始往下执行的。
4.重写fragment生命周期方法时,出了onCreateView,其它的都要调用其父类实现。
5.onAttach()是activity与fragment关联的时候调用,onCreateView是加载fragment的布局,onActivityCreate是确定与fragment关联的activity一定已经创建完毕。
fragment的使用
1.在activity的xml文件中像添加普通控件一样添加fragment,
并为fragment控件的android:name属性绑定一个类A。
2.类A继承于Fragment,重写onCreateView加载fragment的布局。
activity的xml布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
tools:context="com.example.yan.mynews.MainActivity"
<fragment
android:id="@+id/frg"
android:name="com.example.yan.mynews.A"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
fragment中加载的布局文件ft.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">
<TextView
android:id="@+id/news_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
A类:
public class A extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.ft, container, false);
return view;
}
}
主activity:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
经历以上几步,一个fragment就会显示出来了。
fragment的管理
1.如果需要动态移除,添加fragment,则需要开启fragment的事务管理。
//获取frgment的管理器
FragmentManager fm = getFragmentManager();
//开启一个事务
FragmentTransaction transaction = fm.beginTransaction();
newf = new ContentFragment();
//使用另一个frgment newf 加载到指定id位置
transaction.replace(R.id.id_content, mWeixin);
//提交事务
transaction.commit();
2.把fragment添加的回退栈,是摁back键的时候显示上一个fragment。则需要在commit之前,写transction.addToBackStack(Stirng);
fragment与activity之间的通信
1.在fragment中,使用getActivity()可以获得与此fragment关联的activity对象,
注:如果在Fragment中需要Context,可以通过调用getActivity(),如果该Context需要在Activity被销毁后还存在,则使用getActivity().getApplicationContext()。
2.在activity中,使用getFragmentManager.findFragmentByTag()或者findFragmentById()获得任何Fragment实例,然后进行操作。
参考文章http://blog.csdn.net/lmj623565791/article/details/37970961
参考文章http://blog.csdn.net/lmj623565791/article/details/37992017