博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深入分析动态管理Fragment
阅读量:6293 次
发布时间:2019-06-22

本文共 4638 字,大约阅读时间需要 15 分钟。

一、Fragment与Activity的关系

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

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

二、使用FragmentManager组件

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

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

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

三、实现案例

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

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

1、Activity的布局如下

2、FloorFragment代码 

public class FloorFragment extends Fragment implements OnClickListener {    @Override    public void onAttach(Activity activity) {        super.onAttach(activity);            }    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container,            Bundle savedInstanceState) {        // TODO Auto-generated method stub        View view=inflater.inflate(R.layout.floor_fragment, container,false);        LinearLayout home=(LinearLayout)view.findViewById(R.id.home);        LinearLayout list=(LinearLayout)view.findViewById(R.id.list);        home.setOnClickListener(this);        list.setOnClickListener(this);        return view;    }    //定义接口,该接口在Activity中去实现,降低Activity与Fragment的耦合度    public interface OnContentFragmentListener{        void setContentFragment(String param);    }    private OnContentFragmentListener onContentFragmentListener;    public void setOnContentFragmentListener(            OnContentFragmentListener onContentFragmentListener) {        this.onContentFragmentListener = onContentFragmentListener;    }    @Override    public void onClick(View view) {        // TODO Auto-generated method stub        if(onContentFragmentListener!=null){            switch(view.getId()){            case R.id.home:                //回调机制,调用实现类的方法                onContentFragmentListener.setContentFragment("主面板Fragment");                break;            case R.id.list:                onContentFragmentListener.setContentFragment("列表信息");                break;            }            }    }}

3、ContentFragment代码 

public class ContentFragment extends Fragment {    private String title;    public void setArguments(Bundle args) {        title=args.getString("title");    }    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container,            Bundle savedInstanceState) {        View view=inflater.inflate(R.layout.content_fragment, container,false);        if(title!=null)((TextView)view.findViewById(R.id.tvContent)).setText(title);        return view;    }}

4、DynaFragmentActivity代码

public  class  DynaFragmentActivity  extends  FragmentActivity implements FloorFragment.OnContentFragmentListener {    private ContentFragment contentFragment;    private FloorFragment floor;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        super.setContentView(R.layout.dyna_fragment_activity);        initFragment();    }    private  void initFragment(){    floor=(FloorFragment)super.getSupportFragmentManager().findFragmentById(R.id.floor);        floor.setOnContentFragmentListener(this);//注册侦听,传入实现类对象        contentFragment=new ContentFragment();        FragmentManager fm=super.getSupportFragmentManager();        fm.beginTransaction().add(R.id.content,contentFragment,"content").commit();    }        public void setFragment(Fragment fragment){        getSupportFragmentManager().beginTransaction().replace(R.id.content, fragment).commit();    }        @Override    public void setContentFragment(String param) {        // TODO Auto-generated method stub        Bundle bundle=new Bundle();        bundle.putString("title", param);        contentFragment=new ContentFragment();        contentFragment.setArguments(bundle);        super.getSupportFragmentManager().beginTransaction()        .replace(R.id.content, contentFragment).commit();    }    }

 

作者:
出处:
 
本文版权归和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
 

转载于:https://www.cnblogs.com/jerehedu/p/4340979.html

你可能感兴趣的文章
SpringBoot 整合Redis
查看>>
2014上半年大片早知道
查看>>
Android 6.0指纹识别App开发案例
查看>>
正文提取算法
查看>>
轻松学PHP
查看>>
Linux中的网络监控命令
查看>>
this的用法
查看>>
windows下安装redis
查看>>
CentOS7 yum 安装git
查看>>
启动日志中频繁出现以下信息
查看>>
httpd – 对Apache的DFOREGROUND感到困惑
查看>>
分布式锁的一点理解
查看>>
idea的maven项目,install下载重复下载本地库中已有的jar包,而且下载后jar包都是lastupdated问题...
查看>>
2019测试指南-web应用程序安全测试(二)指纹Web服务器
查看>>
树莓派3链接wifi
查看>>
js面向对象编程
查看>>
Ruby中类 模块 单例方法 总结
查看>>
jQuery的validate插件
查看>>
5-4 8 管道符 作业控制 shell变量 环境变量配置
查看>>
Enumberable
查看>>