Android百日程序: Fragment动态管理和生命期

之前写过Fragment使用的程序,Fragment可以静态,也可以动态载入内存中的,这一章进一步看看如何动态地更换Fragment和看看Fragment生命期都有什么函数。


本章利用响应菜单点击事件,轮流载入不同的Fragment,显示不同的界面,效果如下:

开始的是没有载入Fragmen为空白:


点击菜单的NEXT FRAGMENT VIEW,就进入下一个界面,载入两个:


继续点击显示Fragment 1:


继续点击,显示Fragment2:


然后就是循环了:



如此循环显示不同画面。

一 首先实现这一效果的关键代码,就是在菜单响应函数中输入如下代码:

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. @Override  
  2. public boolean onOptionsItemSelected(MenuItem item) {  
  3.     int id = item.getItemId();  
  4.     switch (id) {             
  5.     case R.id.next_fragment_view_menu_item: {  
  6.         FragmentManager fragManager = getFragmentManager();  
  7.         FragmentTransaction fragTrans = fragManager.beginTransaction();  
  8.           
  9.         if (0 == turnNum) {  
  10.             Fragment1 frag1 = new Fragment1();  
  11.             Fragment2 frag2 = new Fragment2();  
  12.             fragTrans.replace(R.id.frame_layout1, frag1);  
  13.             fragTrans.replace(R.id.frame_layout2, frag2);  
  14.         } else if (1 == turnNum) {  
  15.             Fragment1 frag1 = new Fragment1();  
  16.             Fragment frag2 = fragManager.findFragmentById(R.id.frame_layout2);  
  17.             fragTrans.replace(R.id.frame_layout1, frag1);  
  18.             if (frag2 != null) fragTrans.remove(frag2);  
  19.         } else if (2 == turnNum) {  
  20.             Fragment frag1 = fragManager.findFragmentById(R.id.frame_layout1);  
  21.             Fragment2 frag2 = new Fragment2();  
  22.             if (frag1 != null) fragTrans.remove(frag1);  
  23.             fragTrans.replace(R.id.frame_layout2, frag2);  
  24.         }  
  25.           
  26.         turnNum++;  
  27.         if (turnNum > 2) turnNum = 0;  
  28.           
  29.         fragTrans.addToBackStack(null);  
  30.         fragTrans.commit();  
  31.         return true;  
  32.     }  
  33.       
  34.     }  
  35.     return super.onOptionsItemSelected(item);  
  36. }  



1 FragmentManager 是管理所有Fragment的类,故此查找已有的Fragment使用函数: Fragment frag2 = fragManager.findFragmentByI(R.id.framelayout2);注意要判断是否取回Fragment,如果没有那么frag2 == null。

2 FragmentTransaction管理Fragment变更事务,所有动作,如例子中的remove, replace,都必须是在beginTransaction()和commit()之间才会生效,重复调用commit而没有调用beginTransaction会程序崩溃的。

3 addToBackStack(null),就是手动把Fragment放在栈中,这样可以使用back按键退回上一层的Fragment安排。Activity是自动放到栈中的。

4 简单逻辑:turnNum是全局变量,根据这个turnNum的值的不同使用不同的Fragment。

二 主界面的xml如下:

[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     tools:context="bill.su.fragment.MainActivity"  
  6.     android:orientation="horizontal"  
  7.     android:id="@+id/linear_fragment"  
  8.     android:baselineAligned="false" >  
  9.   
  10.     <FrameLayout  
  11.         android:id="@+id/frame_layout1"  
  12.         android:layout_weight="1"  
  13.         android:layout_width="0sp"  
  14.         android:layout_height="match_parent" />  
  15.   
  16.     <FrameLayout  
  17.         android:id="@+id/frame_layout2"  
  18.         android:layout_weight="1"  
  19.         android:layout_width="0sp"  
  20.         android:layout_height="match_parent" />  
  21.   
  22. </LinearLayout>  

两个FrameLayout用来装Fragment


三 菜单res/menu/main.xml的代码:

[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <menu xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     tools:context="bill.su.fragment.MainActivity" >  
  4.   
  5.     <item   
  6.         android:id="@+id/next_fragment_view_menu_item"  
  7.         android:showAsAction="always"  
  8.         android:title="@string/next_fragment_view_menu_item" />  
  9.   
  10. </menu>  

四 测试Fragment生命期的全部代码:

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. package bill.su.fragment;  
  2.   
  3. import android.app.Activity;  
  4. import android.app.Fragment;  
  5. import android.os.Bundle;  
  6. import android.util.Log;  
  7. import android.view.LayoutInflater;  
  8. import android.view.View;  
  9. import android.view.ViewGroup;  
  10.   
  11. public class Fragment1 extends Fragment {  
  12.     private final String TAG = "FRAGMENTTAG1";  
  13.       
  14.     @Override  
  15.     public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  16.             Bundle savedInstanceState) {  
  17.         Log.d(TAG, "onCreateView called");  
  18.           
  19.         return inflater.inflate(R.layout.fragment1, container, false);            
  20.     }  
  21.       
  22.     @Override  
  23.     public void onAttach(Activity activity){  
  24.         super.onAttach(activity);  
  25.         Log.d(TAG, "onAttach called");  
  26.     }  
  27.       
  28.     @Override  
  29.     public void onCreate(Bundle savedInstanceState){  
  30.         super.onCreate(savedInstanceState);  
  31.         Log.d(TAG, "onCreate called");  
  32.     }  
  33.       
  34.     @Override  
  35.     public void onActivityCreated(Bundle savedInstanceState){  
  36.         super.onActivityCreated(savedInstanceState);  
  37.         Log.d(TAG, "onActivityCreted called");  
  38.     }  
  39.       
  40.     @Override  
  41.     public void onStart(){  
  42.         super.onStart();  
  43.         Log.d(TAG, "onStart called");  
  44.     }  
  45.       
  46.     @Override  
  47.     public void onResume() {  
  48.         super.onResume();  
  49.         Log.d(TAG, "onResume called");  
  50.     }  
  51.       
  52.     @Override  
  53.     public void onPause() {  
  54.         super.onPause();  
  55.         Log.d(TAG, "onPause called");  
  56.     }  
  57.       
  58.     @Override  
  59.     public void onStop(){  
  60.         super.onStop();  
  61.         Log.d(TAG, "onStop called");  
  62.     }  
  63.       
  64.     @Override  
  65.     public void onDestroyView() {  
  66.         super.onDestroyView();  
  67.         Log.d(TAG, "onDestroyView called");  
  68.     }  
  69.       
  70.     @Override  
  71.     public void onDestroy() {  
  72.         super.onDestroy();  
  73.         Log.d(TAG, "onDestroy called");  
  74.     }  
  75.       
  76.     @Override  
  77.     public void onDetach() {  
  78.         super.onDetach();  
  79.         Log.d(TAG, "onDetach called");  
  80.     }  
  81. }  

主要和Activity不同的是:

onAttached() : Fragment和Activity接起来的是调用

onCreateView(): Fragment的View创建

onActivityCreated():当Activity的onCreate()调用的时候调用

onDestroyView(): 当Fragment的view删除的时候调用

onDetach(): Fragment从Activity中去掉的是调用


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值