全国免费服务热线:

18982081108
✕

成都弹性云服务器,成都高防云服务器,互联网数据服务,成都祈钰瑶

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

一、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. 2、FloorFragment代码
  24. 复制代码
  25. public class FloorFragment extends Fragment implements OnClickListener {
  26. @Override
  27. public void onAttach(Activity activity) {
  28. super.onAttach(activity);
  29. }
  30. @Override
  31. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  32. Bundle savedInstanceState) {
  33. // TODO Auto-generated method stub
  34. View view=inflater.inflate(R.layout.floor_fragment, container,false);
  35. LinearLayout home=(LinearLayout)view.findViewById(R.id.home);
  36. LinearLayout list=(LinearLayout)view.findViewById(R.id.list);
  37. home.setOnClickListener(this);
  38. list.setOnClickListener(this);
  39. return view;
  40. }
  41. //定义接口,该接口在Activity中去实现,降低Activity与Fragment的耦合度
  42. public interface OnContentFragmentListener{
  43. void setContentFragment(String param);
  44. }
  45. private OnContentFragmentListener onContentFragmentListener;
  46. public void setOnContentFragmentListener(
  47. OnContentFragmentListener onContentFragmentListener) {
  48. this.onContentFragmentListener = onContentFragmentListener;
  49. }
  50. @Override
  51. public void onClick(View view) {
  52. // TODO Auto-generated method stub
  53. if(onContentFragmentListener!=null){
  54. switch(view.getId()){
  55. case R.id.home:
  56. //回调机制,调用实现类的方法
  57. onContentFragmentListener.setContentFragment("主面板Fragment");
  58. break;
  59. case R.id.list:
  60. onContentFragmentListener.setContentFragment("列表信息");
  61. break;
  62. }
  63. }
  64. }
  65. }
3、ContentFragment代码
 
 
 
 
  1. public class ContentFragment extends Fragment {
  2. private String title;
  3. public void setArguments(Bundle args) {
  4. title=args.getString("title");
  5. }
  6. @Override
  7. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  8. Bundle savedInstanceState) {
  9. View view=inflater.inflate(R.layout.content_fragment, container,false);
  10. if(title!=null)((TextView)view.findViewById(R.id.tvContent)).setText(title);
  11. return view;
  12. }
  13. }

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. }
  10. private void initFragment(){
  11. floor=(FloorFragment)super.getSupportFragmentManager().findFragmentById(R.id.floor);
  12. floor.setOnContentFragmentListener(this);//注册侦听,传入实现类对象
  13. contentFragment=new ContentFragment();
  14. FragmentManager fm=super.getSupportFragmentManager();
  15. fm.beginTransaction().add(R.id.content,contentFragment,"content").commit();
  16. }
  17. public void setFragment(Fragment fragment){
  18. getSupportFragmentManager().beginTransaction().replace(R.id.content, fragment).commit();
  19. }
  20. @Override
  21. public void setContentFragment(String param) {
  22. // TODO Auto-generated method stub
  23. Bundle bundle=new Bundle();
  24. bundle.putString("title", param);
  25. contentFragment=new ContentFragment();
  26. contentFragment.setArguments(bundle);
  27. super.getSupportFragmentManager().beginTransaction()
  28. .replace(R.id.content, contentFragment).commit();
  29. }
  30. }