1概要介绍
一个Fragment代表一个行为或Activity中用户界面的一部分。你能够在一个Activity中组合使用多个Fragment来创建一个多面板的用户界面,并且可以在多个Activity中重用同一个Fragment。你可以把一个Fragment想象成一个Activity的模块,它有自己的生命周期,接受它们自己的输入事件。最常见的Fragment是与tab构成新闻导航页面的内容,往往导航栏下面的正文就是一个Fragment。
2 Fragment的生命周期
实测通过使用Action Bar 对fagment的切换,发现fragment在第一次创建的时候依次调用onCreate()、onCreateView()、onResume()方法:
I/System.out( 7731): it is frgment create
I/System.out( 7731): it is frgmentoncreateview
I/System.out( 7731): it is frgment onresume
而当我切换fragment A到fragment B时,它会先调用onPause()方法,紧接着调用onStop()方法:
I/System.out( 7731): it is frgment onPause
I/System.out( 7731): it is frgment onStop
当我从fragment B重新切换到切换fragment A时,它会重新调用onCreateView()方法,也就是说fragment重新显示的时候会被Activity调用这个方法重画视图,再言之,适配器将被重新加载!然后再调用onResume ()方法:
I/System.out( 7731): it is frgmentoncreateview
I/System.out( 7731): it is frgment onresume
3. Fragment的状态
管理Fragment的生命周期有点像管理Activity的生命周期跟Activity一样,Fragment也存在三种状态: 状态 |
|
恢复态(Resumed) |
这种状态下,Fragment显示在正在运行的Activity中。 |
暂停态(Paused) |
这种状态下,另一个Activity在前台,并且有焦点,但这个Fragment所在的Activity依然是可见的(它前面的Activity是部分透明或没有完全覆盖它) |
终止态(Stopped) |
这种状态下,Fragment是不可见的,既可以是持有它的Activity已经被终止,也可以是Fragment从Activity中被删除,但被添加到了回退堆栈中。 |
|
|
|
4几种实例应用
4.1通过Activity的布局文件将Fragment加入Activity
你能够像一个视图那样给Fragment指定布局属性。下例说明了给Activity指定两个Fragment的布局文件。
视图的布局文件分别在leftfragment和rightfragment中编辑,而在主MainActivity中只需要显示主视图就行了。
publicclass TestActivity extendsActivity {
/** Calledwhen the activity is first created. */
@Override
public voidonCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
主Activity的布局文件res/layout/main.xml,其中两个fragment的name部分指定了属性对应的就是自定义Fragment类的全名,系统会根据这个调用指定的Fragment的onCreateView()方法来得到这个Fragment的布局,然后加入Activity中。
<?xmlversion="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal">
<fragment
android:id="@+id/left_fragment"
android:name="xhw.test.namespace.LeftFragment"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_weight="2"/>
<fragment
android:id="@+id/right_fragment"
android:name="xhw.test.namespace.RightFragment"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_weight="1"/>
</LinearLayout>
4.2Activity与Fragment之间的通讯
这里同样示例通过XML布局文件中静态声明fragment的通讯方法:
(1)Fragment能够使用getActivity()方法访问Activity的实例,并且很容易执行如在Activity布局中查找View的任务:
View listView =getActivity().findViewById(R.id.list);
(2)同样Activity通过从FragmentManager中获得的Fragment引用也能够调用Fragment中的方法,使用findFragmentById()或findFragmentByTag()方法获取Fragment引用(只有在main.xml文件中直接声明的fragment可以用),不然会报空指针错误。例如:
ExampleFragment fragment =(ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);
在前面示例1的基础上,打开LeftFragment.java,添加onActivityCreated方法,并处理按钮的点击事件:
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Button button = (Button)getActivity().findViewById(R.id.previous_button);
button.setOnClickListener(newOnClickListener() {
@Override
public void onClick(View v) {
TextView textView = (TextView)getActivity().findViewById(R.id.show_message);
Toast.makeText(getActivity(),textView.getText(), Toast.LENGTH_LONG).show();
}
});
}