当前位置:首页 > ActionBar笔记
创建FragmentonActivityCreated()onAttach()onCreate()onCreateView()onStart()OnResume()Fragment处于活动状态onStop()onDestroyView()OnPause()销毁FragmentonDetach()onDistroyView() ? 通常情况下,创建Fragment需要继承Fragment的基类,并至少应实现onCreate()、onCreateView()和
onPause()三个生命周期的回调函数
? onCreate()函数是在Fragment创建时被调用,用来初始化Fragment中的必要组件
? onCreateView()函数是Fragment在用户界面上第一次绘制时被调用,并返回Fragment的根布局
视图
? onPause()函数是在用户离开Fragment时被调用,用来保存Fragment中用户输入或修改的内容
? 如果仅通过Fragment显示元素,而不进行任何的数据保存和界面事件处理,则可仅实现onCreateView()
函数
3.FragmentDemo示例(如何在一个Activity中同时加载两个Fragment)
通过回退堆栈
(1)main.xml文件是Activity的布局文件,两个Fragment在界面上的位置关系就在这个文件中进行的定义
1. 3. android:layout_width=\ 4. android:layout_height=\ 5. 9. android:layout_height=\ 10. 14. android:layout_height=\15.
5
(2)FragmentDemoActivity是该示例主界面的Activity,加载了main.xml文件声明的界面布局。FragmentDemoActivity.java文件的完整代码如下
1. public class FragmentDemoActivity extends Activity { 2. @Override
3. public void onCreate(Bundle savedInstanceState) { 4. super.onCreate(savedInstanceState); 5. setContentView(R.layout.main); 6. } 7. }
说明:Android系统会根据代码第5行的内容加载界面布局文件main.xml,然后通过main.xml文件中对Fragment所在的“包+类”的描述,找到Fragment的实现类,并调用类中的onCreateView()函数绘制界面元素。 (3)AFragment.java文件的核心代码如下
1. public class AFragment extends Fragment{ 2. @Override
3. public View onCreateView(LayoutInflater inflater, ViewGroup container, 4. Bundle savedInstanceState) { 5. return inflater.inflate(R.layout.frag_a, container, false); 6. } 7. }
说明:AFragment中只实现了onCreateView()函数(代码第3行),返回值是AFragment的视图。
代码第5行使用inflate()函数,通过指定资源文件R.layout.frag_a,获取到AFragment的视图。 (4)最后给出frag_a.xml文件的全部代码如下
1.
2. 7. android:layout_width=\8. android:layout_height=\9. android:text=\10. 11. android:layout_width=\12. android:layout_height=\ 13. android:text=\这是AFragment的显示区域,通过这行文字可以看到与BFragment的边界\14. 15. android:layout_width=\16. android:layout_height=\ 17. android:text=\选项\18.
三、Tab导航栏(操作栏和Fragment实现Tab导航栏)
在界面控件的章节中介绍过使用TabHost和TabActivity实现Tab导航栏的功能,但因为TabActivity已经过期,所以这里介绍一种新方法,使用操作栏和Fragment实现Tab导航栏。
下面用FragmentTab示例说明如何使用操作栏和Fragment实现Tab导航栏,FragmentTab示例的用户界面如图:
6
1、FragmentTab示例
(1)Fragment建立
第一个Tab页的标题为“FRAGMENT A”,第二个Tab页的标题为“FRAGMENT B”,两个Tab页分别加载了不同Fragment,两个Fragment所显示的界面元素略有不同。FragmentTab示例和FragmentDemo示例中的一部分文件的文件名称是完全相同的,这些文件中的代码也是完全相同的。这些文件包括AFragment.java、BFragment.java、frag_a.xml和frag_b.xml。源代码参考前边的FragmentDemo示例。
(2)建立Tab导航栏代码,以及将导航栏和Fragment关联起来的代码都在FragmentTabActivity.java文件中。下面分别介绍FragmentTabActivity.java文件中的核心函数。 先给出onCreate()函数的代码:
1. @Override
2. public void onCreate(Bundle savedInstanceState) { 3. super.onCreate(savedInstanceState); 4.
5. final ActionBar bar = getActionBar();
6. bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 7. bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE); 8. bar.addTab(bar.newTab()
9. .setText(\
10. .setTabListener(new TabListener
1. bar.addTab(bar.newTab()
2. .setText(\
3. .setTabListener(new TabListener
1. if (savedInstanceState != null) {
2. bar.setSelectedNavigationItem(savedInstanceState.getInt(\3. } 4. } 说明:
? 代码第5行调用getActionBar()获取操作栏实例。
? 代码第6行将操作栏的导航模式设置为Tab导航栏模式,NAVIGATION_MODE_TABS常量的值为2。还支持的常
量包括NAVIGATION_MODE_LIST(值为1)和NAVIGATION_MODE_STANDARD(值为0),分别表示列表导航栏和标准导航栏。
? 代码第7行用来设置操作栏的显示选项。setDisplayOptions(int options, int mask)函数的options参数表示显示的
内容,而mask参数则表示不显示的内容。第7行代码的意思是关闭“显示标题文字(DISPLAY_SHOW_TITLE)”。setDisplayOptions()函数支持的常量如表5.4所示。
? 代码第9行使用add()函数添加Tab页,代码第10行设置Tab页的标题,代码第11行定义这是Tab页点击事件
的监听函数。
? 代码第16行和第17行,表明如果Activity不是首次启动,则在savedInstanceState变量中获取当前Tab页的索
7
引号。
? setDisplayOptions()函数支持的常量 常量 DISPLAY_HOME_AS_UP值 4 16 2 8 1 说明 在Home元素左侧显示回退按钮 显示自定义视图 在操作栏中显示Home元素 显示Activity的标题 使用Logo代替程序图标 DISPLAY_SHOW_CUSTOMDISPLAY_SHOW_HOMEDISPLAY_SHOW_TITLEDISPLAY_USE_LOGO(3)onSaveInstanceState()函数在Activity临时推出时,将当前Tab页的索引号保存在Bundle中,代码如下:
1. @Override
2. protected void onSaveInstanceState(Bundle outState) { 3. super.onSaveInstanceState(outState);
4. outState.putInt(\5. } 说明:
构造Tab导航栏的事件监听函数,必须实现ActionBar.TabListener接口,主要是实现接口中的3个函数,分别是onTabSelected()、onTabUnselected()和onTabReselected()。onTabSelected()在当前Tab页被选中时调用,onTabUnselected()在其它Tab页被选中时调用,onTabReselected()在当前Tab页被再次选中时调用。 (4)静态类TabListener的代码如下:
1 public static class TabListener
8 public TabListener(Activity activity, String tag, Class
12 public TabListener(Activity activity, String tag, Class
18 mFragment = mActivity.getFragmentManager().findFragmentByTag(mTag); 19 if (mFragment != null && !mFragment.isDetached()) {
20 FragmentTransaction ft = mActivity.getFragmentManager().beginTransaction(); 21 ft.detach(mFragment); 22 ft.commit(); 23 } 24 } 25
8
26 public void onTabSelected(Tab tab, FragmentTransaction ft) { 27 if (mFragment == null) {
28 mFragment = Fragment.instantiate(mActivity, mClass.getName(), mArgs); 29 ft.add(android.R.id.content, mFragment, mTag); 30 } else {
31 ft.attach(mFragment); 32 } 33 } 34
35 public void onTabUnselected(Tab tab, FragmentTransaction ft) { 36 if (mFragment != null) { 37 ft.detach(mFragment); 38 } 39 } 40
41 public void onTabReselected(Tab tab, FragmentTransaction ft) {
42 Toast.makeText(mActivity, \43 } 44 } 说明:
? FragmentTransaction是封装了Fragment变换所要用的函数,包括将Fragment加入到Activity的add()函数,将
Fragment从当前界面分离的Detach()函数,将被Detach()函数分离的Fragment重新连接到界面的attach()函数。 ? 上面的代码具有一定的难度,部分内容涉及到Java泛型编程的内容,例如代码第1行和第12行,读者可以参考
Java语言的相关资料。
9
共分享92篇相关文档