博客
关于我
fragment
阅读量:219 次
发布时间:2019-02-28

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

Fragment深入解析:从基础到实战

Fragment的核心作用

Fragment是Android系统从Android 3.0开始引入的核心组件,主要解决以下问题:

  • 适配多种屏幕尺寸:Fragment可以通过动态替换实现多种屏幕适配需求
  • 优化Activity切换性能:通过Fragment实现多个Activity之间的高效切换
  • 模块化设计:支持代码的复用与模块化管理
  • Fragment的生命周期

    Fragment的生命周期设计与Activity类似,主要包括以下阶段:

  • onCreate:创建Fragment实例,准备UI布局
  • onActivityCreated:Fragment的UI已创建完成
  • onAttach:Fragment与宿主Activity建立关联
  • onDetach:Fragment从宿主Activity脱离
  • onDestroy:销毁Fragment实例
  • Fragment数据传递:Bundle的最佳选择

    数据传递是Fragment开发的核心需求。通过Bundle实现高效传递:

    public static OneFragment newInstance(int args) {    OneFragment fragment = new OneFragment();    Bundle bundle = new Bundle();    bundle.putInt("someArgs", args);    fragment.setArguments(bundle);    return fragment;}@Overridepublic void onCreate(@Nullable Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    Bundle bundle = getArguments();    int args = bundle.getInt("someArgs");}

    注意事项setArguments必须在Fragment创建后,添加给Activity前调用,避免先add再设置参数。

    Fragment的两种加载方式

    方式一:直接使用FragmentManager

    FragmentManager fragmentManager = getSupportFragmentManager();FragmentTransaction ft = fragmentManager.beginTransaction();ft.add(R.id.fragment_container, new MyFragment());ft.commit();

    优点:简单直观,适合简单的Fragment替换操作

    方式二:ViewPager适配器

    class MyFragmentPagerAdapter extends FragmentPagerAdapter {    public MyFragmentPagerAdapter(FragmentManager fm, List
    fragments) { super(fm, fragments); } @Override public Fragment getItem(int position) { return fragments.get(position); }}

    FragmentPagerAdapter vs FragmentStatePagerAdapter

    • FragmentPagerAdapter:保留Fragment实例,仅销毁View
    • FragmentStatePagerAdapter:销毁不再需要的Fragment,节省内存

    选择哪种适配器取决于Fragment数量和内存需求。

    Fragment的关键方法

    Fragment操作方法

    • add():添加Fragment到Activity
    • remove():移除Fragment
    • replace():替换Fragment(建议使用hide()和show())
    • hide()show():控制Fragment的可见性
    • addToBackStack():添加到回退栈
    • commit():提交事务操作

    方法区别

    • show()hide():仅改变View的可见性,不触发生命周期
    • replace():销毁当前Fragment,重新添加新Fragment

    FragmentManager栈视图

    FragmentManager维护多个Fragment栈,包括:

  • 宿主Activity的FragmentManager:通过getSupportFragmentManager()获取
  • 嵌套Fragment的FragmentManager:通过getFragmentManager()getChildFragmentManager()获取
  • Fragment间通信:高内聚低耦合

    Fragment间通信应通过宿主Activity进行管理,避免直接操作其他Fragment:

    public interface FragmentClickListener {    void onFragmentClick();}public class OneFragment extends Fragment implements View.OnClickListener {    private FragmentClickListener clickListener;    public void setClickListener(FragmentClickListener clickListener) {        this.clickListener = clickListener;    }    @Override    public void onClick(View v) {        clickListener.onFragmentClick();    }}

    宿主Activity实现FragmentClickListener接口即可接收Fragment的事件。

    FragmentPagerAdapter与FragmentStatePagerAdapter

    FragmentPagerAdapter

    • 保留Fragment实例:仅销毁View层
    • 缺点:内存占用较高

    FragmentStatePagerAdapter

    • 销毁Fragment实例:通过onSaveInstanceState保存状态,onCreate恢复创建
    • 优点:内存占用较低

    选择哪种适配器根据Fragment数量和内存需求决定。

    getActivity()引用问题

    常见问题

    • getActivity()返回null:可能是Fragment已被detach或Activity已销毁

    解决方法

  • 使用Context引用
    Context context;@Overridepublic void onAttach(Context context) {    super.onAttach(context);    this.context = context;}
  • 全局变量管理:在Fragment中定义全局变量存储Activity引用
  • Fragment嵌套ViewPager

    主Fragment使用ViewPager

    class MyFragmentPagerAdapter extends FragmentPagerAdapter {    public MyFragmentPagerAdapter(FragmentManager fm, List
    fragments) { super(fm, fragments); } @Override public Fragment getItem(int position) { return fragments.get(position); }}

    子Fragment使用getChildFragmentManager

    FragmentManager fm = getChildFragmentManager();mPager.setAdapter(new MyFragmentPagerAdapter(fm, fragmentList));

    通过ViewPager实现多Fragment切换,适合Tab 栏式应用。

    转载地址:http://myss.baihongyu.com/

    你可能感兴趣的文章
    NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
    查看>>
    NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
    查看>>
    NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
    查看>>
    NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
    查看>>
    Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
    查看>>
    NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
    查看>>
    NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
    查看>>
    NIFI大数据进阶_NIFI监控的强大功能介绍_处理器面板_进程组面板_summary监控_data_provenance事件源---大数据之Nifi工作笔记0025
    查看>>
    NIFI大数据进阶_内嵌ZK模式集群1_搭建过程说明---大数据之Nifi工作笔记0015
    查看>>
    NIFI大数据进阶_外部ZK模式集群1_实际操作搭建NIFI外部ZK模式集群---大数据之Nifi工作笔记0017
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_01_实际操作---大数据之Nifi工作笔记0029
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
    查看>>
    NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
    查看>>
    NIFI数据库同步_多表_特定表同时同步_实际操作_MySqlToMysql_可推广到其他数据库_Postgresql_Hbase_SqlServer等----大数据之Nifi工作笔记0053
    查看>>
    NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南001---大数据之Nifi工作笔记0068
    查看>>