免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1328 | 回复: 0
打印 上一主题 下一主题

[Android] Android_Fragment_Fragment详解 [复制链接]

论坛徽章:
80
20周年集字徽章-庆
日期:2020-10-28 14:09:1215-16赛季CBA联赛之北京
日期:2020-10-28 13:32:5315-16赛季CBA联赛之北控
日期:2020-10-28 13:32:4815-16赛季CBA联赛之天津
日期:2020-10-28 13:13:35黑曼巴
日期:2020-10-28 12:29:1520周年集字徽章-周	
日期:2020-10-31 15:10:0720周年集字徽章-20	
日期:2020-10-31 15:10:07ChinaUnix元老
日期:2015-09-29 11:56:3020周年集字徽章-年
日期:2020-10-28 14:14:56
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-09-18 13:27 |只看该作者 |倒序浏览
本帖最后由 baopbird2005 于 2015-09-18 13:36 编辑

1.Fragment概述
在一个Activity中, Fragment代表UI的一个部分或者一个行为。一个Activity可以结合多个Fragment对象,也可以在多个activity中使用相同Fragment字节码对应的不同对象。一个Fragment对象必须被嵌入在一个主Activity对象中,该Fragment的生命周期与主Activity息息相关。比如,当主Activity处于paused状态,其对应的所有Fragment对象均处于paused状态,只有当主Activity处于resumed状态时,Fragment才能处于自由控制状态。
2.创建Fragment
为了创建一个Fragment,应该去继承Fragment或者其子类,覆写相应的方法。比如onCreate(),OnCreateView(),onPause()等等
(1).添加UI界面
为该Fragment展现一个布局,必须去实现onCreateView()回掉方法。
注意:当该Fragment继承了ListFragment时,不需要覆写onCreateView()方法,因为默认返回一个ListView对象
  1. public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  2.         Bundle savedInstanceState) {  
  3.     View view = inflater.inflate(R.layout.list, null);  
  4.     return view;  
  5. }  
复制代码
(2).添加Fragment到Activity
1).通过layout布局文件
android:name属性应该为Fragment对应类的完整路径。
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="horizontal" >  
  6.   
  7.     <fragment  
  8.         android:id="@+id/list"  
  9.         android:name="com.example.news.ArticleListFragment"  
  10.         android:layout_width="0dp"  
  11.         android:layout_height="match_parent"  
  12.         android:layout_weight="1" />  
  13.     <fragment  
  14.         android:id="@+id/viewer"  
  15.         android:name="com.example.news.ArticleReaderFragment"  
  16.         android:layout_width="0dp"  
  17.         android:layout_height="match_parent"  
  18.         android:layout_weight="2" />  
  19.   
  20. </LinearLayout>  
复制代码
2).通过Java代码
当Activity运行时,可以自由的在该activity上添加fragment对象,但应该指定一个ViewGroup容器,可以FragmentTransaction完成fragment的添加移除或者替换。
  1. manager = getFragmentManager();  
  2. if(manager.findFragmentByTag("right") == null){  
  3.     manager.beginTransaction().replace(R.id.right, new RightFrag(), "right").commit();  
  4. }  
复制代码
(3).fragment唯一标示符
每个fragment需要定义一个唯一的标识符,如果activity被销毁又重新启动,系统能够恢复该fragment的状态。如果想重新恢复,需满足下面有3种方式之一:
1).定义ID
在布局文件中,定义android:id属性
  1. <fragment  
  2.     android:id="@+id/list"  
  3.     android:name="com.example.news.ArticleListFragment"  
  4.     android:layout_width="0dp"  
  5.     android:layout_height="match_parent"  
  6.     android:layout_weight="1" />  
复制代码
2).指明tag
android:tag 指明 或者 一个fragment对象add()或者replace()时指定tag
  1. <fragment  
  2.     android:id="@+id/list"  
  3.     android:tag="first"  
  4.     android:name="com.example.news.ArticleListFragment"  
  5.     android:layout_width="0dp"  
  6.     android:layout_height="match_parent"  
  7.     android:layout_weight="1" />  
复制代码
或者
  1. manager.beginTransaction()  
  2.     .replace(R.id.right, new RightFrag(), "right")//在事务中指明该fragment的tag  
  3. .commit();
复制代码
3).viewgroup ID
如果该fragment均没有id和tag,系统将使用container view布局的id
3.Fragment的管理
通过getFragmentManager()方法,可以得到FragmentManager对象,主要完成下面的功能
  1. view plaincopy
  2. FragmentManager manager = getFragmentManager();  
复制代码
(1).得到已经存在Fragment对象
如果该fragment在布局文件中指定了id,通过findFragmentById()得到对象,或者指定了tag可以通过findFragmentByTag()得到对象
  1. view plaincopy
  2. Fragment fragment = getFragmentManager().findFragmentByTag("right");  
  3. //or  
  4. Fragment fragment = getFragmentManager().findFragmentById(id);  
复制代码
(2).注册OnBackStackChangedListener监听器
可以用来监听该任务对应的返回栈信息,当该返回栈状态发生改变时,执行对应的onBackStackChanged() 方法
  1. view plaincopy
  2. manager.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {  
  3.     @Override  
  4.     public void onBackStackChanged() {  
  5.         Toast.makeText(MainActivity.this, "返回堆状态发生改变", 1).show();  
  6.     }  
  7. });  
复制代码
(3).弹出返回栈
模拟用户点击返回键,将指定的fragment从返回栈中弹出,该操作为异步的。前提是该fragment对象使用.beginTransaction().addToBackStack("right"添加了进返回栈
  1. view plaincopy
  2. manager.popBackStack(); //Pop the top state off the back stack  
复制代码
(4).FragmentTransaction事务
事务主要包含一些操作的集合,比如增加移除替换,动画设置等等
  1. view plaincopy
  2. /*  
  3. * 通过manager开启一个事务,该事务包含一些操作的集合,通事务可以 add(), remove(), replace()  
  4. * 完成对Fragment的操作,并使用commit()提交  
  5. */  
  6. FragmentTransaction transaction = manager.beginTransaction();  
  7.   
  8. transaction.replace(R.id.right, new RightFrag(), "right");  
  9. transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);//设置动画  
  10. transaction.addToBackStack("right"); // 将该fragment加入返回堆  
  11. // 提交事务  
  12. transaction.commit();  
复制代码
(5).Fragment状态管理
  1. view plaincopy
  2. /*
  3. * 管理Fragment的状态
  4. *  如果在一个主activityViewGroup中添加一个fragment,
  5. *  如果手机屏幕旋转了,当前activity被销毁重建,fragment也被activityManager创建
  6. *  故在onCreate中,需要判断一下
  7. */  
  8. @Override  
  9. protected void onCreate(Bundle savedInstanceState) {  
  10.     super.onCreate(savedInstanceState);  
  11.     setContentView(R.layout.activity_main);  
  12.     manager = getFragmentManager();  
  13.     if (manager.findFragmentByTag("right") == null) {  
  14.         // if(savedInstanceState == null)也可判断该fragment是否已经加载  
  15.   
  16.         manager.beginTransaction()  
  17.             .replace(R.id.right, new RightFrag(), "right")  
  18.             .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)// 设置动画  
  19.             .addToBackStack("right") // 将该fragment加入返回堆  
  20.         // 提交事务  
  21.         .commit();  
  22.     }  
  23. }  
复制代码
4.Fragment间信息交互
(1).取得对象
  1. view plaincopy
  2. /*
  3. * 点击该Fragment的button按钮,将该button的text设置为另一个fragment中Edittext的文本值
  4. */  
  5. public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  6.         Bundle savedInstanceState) {  
  7.     View view = inflater.inflate(R.layout.list, null);  
  8.     final Button button = (Button) view.findViewById(R.id.confirm);  
  9.     button.setOnClickListener(new View.OnClickListener() {  
  10.          
  11.         @Override  
  12.         public void onClick(View v) {  
  13.             //通过FragmentManager找到另一个fragment中的edittext对象,并取得text内容  
  14.             EditText editText = (EditText)(getFragmentManager().findFragmentByTag("left").getView().findViewById(R.id.name));  
  15.             button.setText(editText.getText().toString());  
  16.         }  
  17.     });  
  18.     return view;  
  19. }  
复制代码
(2).通回掉函数
  1. view plaincopy
  2. public class MainActivity extends Activity {  
  3.     private FragmentManager manager;  
  4.     private Button button;  
  5.   
  6.     @Override  
  7.     protected void onCreate(Bundle savedInstanceState) {  
  8.         super.onCreate(savedInstanceState);  
  9.         setContentView(R.layout.activity_main);  
  10.          
  11.         button.setOnClickListener(new View.OnClickListener() {  
  12.             @Override  
  13.             public void onClick(View v) {  
  14.                 RightFragment rightFrag = (RightFragment) (getFragmentManager().findFragmentByTag("right"));  
  15.                 /*
  16.                  * 通过set方法,向其传递一个实例化对象,由于rightFrag.set()方法内部执行RightFragment.CallBack.get()方法,完成了参数的传递
  17.                  */  
  18.                 rightFrag.set(new RightFragment.CallBack() {  
  19.                     @Override  
  20.                     public void get(String str) {  
  21.                         button.setText(str);  
  22.                     }  
  23.                 });  
  24.             }  
  25.         });  
  26.     }  
  27.   
  28. }  
复制代码
  1. view plaincopy
  2. public class RightFragment extends ListFragment {  
  3.     private LoaderManager manager;  
  4.   
  5.     @Override  
  6.     public void onCreate(Bundle savedInstanceState) {  
  7.         super.onCreate(savedInstanceState);  
  8.         manager = getLoaderManager();  
  9.     }  
  10.   
  11.     /*
  12.      * 点击该Fragment的button按钮,将该button的text设置为另一个fragment中Edittext的文本值
  13.      */  
  14.     public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  15.             Bundle savedInstanceState) {  
  16.         View view = inflater.inflate(R.layout.list, null);  
  17.         return view;  
  18.     }  
  19.   
  20.     /**
  21.      * 通过调用该方法,接收一个回掉函数对象,callBack.get(str);
  22.      * @param callBack
  23.      */  
  24.     public void set(CallBack callBack) {  
  25.         EditText editText = (EditText) getView().findViewById(R.id.name);  
  26.         callBack.get(editText.getText().toString());  
  27.     }  
  28.   
  29.     /*
  30.      * 回掉接口
  31.      */  
  32.     interface CallBack {  
  33.         public void get(String str);  
  34.     }  
  35. }  
复制代码
5.Fragment的生命周期
(1).生命周期路线图




(2).生命周期回掉函数概述

onAttach(Activity)         当前Fragment与Activity关联,调用
onCreate()                         完成fragment的初始化创建
onCreateView()                 创建并返回与当前fragment相关联的层次视图view
onActivityCreated()         主activity的onCreate()执行完后,该方法才执行
onStart()                         fragment可见,当主activity处于started状态后执行
onResume()                 fragment能与用户交互,当主activity处于resumed状态后执行
onPause()                         fragment不在与用户交互,可能在主activity将要处于paused前执行,可能该fragment被修改
onStop()                         fragment不在可见,可能在主activity将要处于stopped前执行,可能该fragment被修改
onDestroyView()                 允许该fragment清理视图相关资源
onDestroy()                 清理掉视图state信息
onDetach()                         该fragment不在于activity关联
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP