安卓动态管理Fragment深入分析:“这几个组件你知道吗? ”

移动开发 Android
Fragment可以理解为将Activity划分为若干个片段,Fragment是Activity的一部分,生命周期是依赖Activity的,是不能单独存在的。

一、Fragment与Activity的关系

要理解动态管理Fragment首先要理解一下Fragment与Activity的关系

Fragment可以理解为将Activity划分为若干个片段,Fragment是Activity的一部分,生命周期是依赖Activity的,是不能单独存在的。这样不难理解所有Fragment的管理(查找、添加、删除、替换)都应该在Fragment所依赖的Activity中进行,也就是Activity才是Fragment交互的场所,不要试图在一个Fragment中去管理另一个Fragment虽然也可以实现要求的功能但是不符合规范的。要完成对Fragment的具体操作需要使用FragmentManager组件。

二、使用FragmentManager组件

使用FragmentManager组件的关键代码如下:

  1. //1、创建FragmentManager组件 
  2. FragmentManager fm=super.getSupportFragmentManager(); 
  3. //2、查询方法,获得Activity中某一个Fragment 
  4. fm.findFragmentById(R.id.fooler) 
  5. fm.findFragmentByTag(”tagName”) 
  6. //3、动态添加Fragment 
  7. fm.beginTransaction().add(R.id.content,contentFragment,"content").commit(); 
  8. //4、替换Fragment 
  9. fm.beginTransaction().replace(R.id.OldFragment, newFragment).commit(); 
  10. //5、删除Fragment 
  11. fm.beginTransaction().remove(R.id.myFragment).commit(); 
  12. //6、向Fragment传递数据 
  13. f.setArguments(Bundle )方法传递数据

     

上述管理Fragment代码应组织在Fragment所属的Activity中去,下面就通过一个案例来看看具体实现.

三、实现案例

首先看一下本次的应用案例(如图所示),当单击底部***个区域和第二区域时实现中心区域的切换

界面分析:有三个区域 :头部区域TitleFragment,中心区域是一个FrameLayout布局通过代码动态加载ContentFragment,底部区域FloorFragment

1、Activity的布局如下

  1. RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  2. android:layout_width="match_parent" 
  3. android:layout_height="match_parent"
  4. <fragment android:id="@+id/fgTitle" 
  5. android:layout_width="match_parent" 
  6. android:layout_height="45dp" 
  7. android:name="com.jereh.android.course.fragment.TitleFragment" 
  8. /> 
  9. <FrameLayout android:id="@+id/content" 
  10. android:layout_width="match_parent" 
  11. android:layout_height="match_parent" 
  12. android:layout_below="@id/fgTitle" 
  13. /> 
  14. <fragment android:id="@+id/floor" 
  15. android:layout_width="match_parent" 
  16. android:layout_height="wrap_content" 
  17. android:layout_alignParentBottom="true" 
  18. android:orientation="horizontal" 
  19. android:name="com.jereh.android.course.fragment.FloorFragment" 
  20. /> 
  21. </RelativeLayout> 
  22.  
  23. 复制代码 
  24. 2、FloorFragment代码 
  25. 复制代码 
  26.  
  27. public class FloorFragment extends Fragment implements OnClickListener { 
  28. @Override 
  29. public void onAttach(Activity activity) { 
  30. super.onAttach(activity); 
  31.  
  32. @Override 
  33. public View onCreateView(LayoutInflater inflater, ViewGroup container, 
  34. Bundle savedInstanceState) { 
  35. // TODO Auto-generated method stub 
  36. View view=inflater.inflate(R.layout.floor_fragment, container,false); 
  37. LinearLayout home=(LinearLayout)view.findViewById(R.id.home); 
  38. LinearLayout list=(LinearLayout)view.findViewById(R.id.list); 
  39. home.setOnClickListener(this); 
  40. list.setOnClickListener(this); 
  41. return view; 
  42. //定义接口,该接口在Activity中去实现,降低Activity与Fragment的耦合度 
  43. public interface OnContentFragmentListener{ 
  44. void setContentFragment(String param); 
  45. private OnContentFragmentListener onContentFragmentListener; 
  46. public void setOnContentFragmentListener( 
  47. OnContentFragmentListener onContentFragmentListener) { 
  48. this.onContentFragmentListener = onContentFragmentListener; 
  49. @Override 
  50. public void onClick(View view) { 
  51. // TODO Auto-generated method stub 
  52. if(onContentFragmentListener!=null){ 
  53. switch(view.getId()){ 
  54. case R.id.home: 
  55. //回调机制,调用实现类的方法 
  56. onContentFragmentListener.setContentFragment("主面板Fragment"); 
  57. break
  58. case R.id.list: 
  59. onContentFragmentListener.setContentFragment("列表信息"); 
  60. break
3、ContentFragment代码
  1. public class ContentFragment extends Fragment { 
  2. private String title; 
  3. public void setArguments(Bundle args) { 
  4. title=args.getString("title"); 
  5. @Override 
  6. public View onCreateView(LayoutInflater inflater, ViewGroup container, 
  7. Bundle savedInstanceState) { 
  8. View view=inflater.inflate(R.layout.content_fragment, container,false); 
  9. if(title!=null)((TextView)view.findViewById(R.id.tvContent)).setText(title); 
  10. return view; 
  11. }

     

4、DynaFragmentActivity代码

  1. public class DynaFragmentActivity extends FragmentActivity implements FloorFragment.OnContentFragmentListener { 
  2. private ContentFragment contentFragment; 
  3. private FloorFragment floor; 
  4. @Override 
  5. protected void onCreate(Bundle savedInstanceState) { 
  6. super.onCreate(savedInstanceState); 
  7. super.setContentView(R.layout.dyna_fragment_activity); 
  8. initFragment(); 
  9. private void initFragment(){ 
  10. floor=(FloorFragment)super.getSupportFragmentManager().findFragmentById(R.id.floor); 
  11. floor.setOnContentFragmentListener(this);//注册侦听,传入实现类对象 
  12. contentFragment=new ContentFragment(); 
  13. FragmentManager fm=super.getSupportFragmentManager(); 
  14. fm.beginTransaction().add(R.id.content,contentFragment,"content").commit(); 
  15.  
  16. public void setFragment(Fragment fragment){ 
  17. getSupportFragmentManager().beginTransaction().replace(R.id.content, fragment).commit(); 
  18.  
  19. @Override 
  20. public void setContentFragment(String param) { 
  21. // TODO Auto-generated method stub 
  22. Bundle bundle=new Bundle(); 
  23. bundle.putString("title", param); 
  24. contentFragment=new ContentFragment(); 
  25. contentFragment.setArguments(bundle); 
  26. super.getSupportFragmentManager().beginTransaction() 
  27. .replace(R.id.content, contentFragment).commit(); 
  28.  
责任编辑:chenqingxiang 来源: 杰瑞教育
相关推荐

2021-10-14 06:52:47

算法校验码结构

2021-02-20 08:21:18

Hive动态分区

2009-06-10 18:12:38

Equinox动态化OSGi动态化

2022-09-20 14:11:37

JVM调优命令

2020-09-07 19:38:12

安卓手机Android

2023-07-26 00:16:49

2021-06-11 13:59:22

CSS原子类

2023-12-20 08:23:53

NIO组件非阻塞

2023-12-12 08:41:01

2023-04-26 10:21:04

2024-04-07 00:00:00

ESlint命令变量

2013-11-14 17:02:41

Android多窗口

2015-01-13 11:17:17

2020-07-07 12:30:16

Windows 10Windows操作系统

2021-03-26 11:00:50

SpringMVC组件接口

2017-10-16 13:45:04

2021-02-02 08:21:28

网络面试通信

2020-10-28 11:20:55

vue项目技

2022-03-10 08:25:27

JavaScrip变量作用域

2022-06-24 08:20:04

CAP网络通信
点赞
收藏

51CTO技术栈公众号