zoukankan      html  css  js  c++  java
  • Android Fragment的使用

    定义

    Fragment可以理解成一个迷你型的活动,同样可以包含布局,同样有自己的生命周期。比Activity要轻量级,在程序内部做界面跳转要比Activity快的多。

    静态添加

    Fragment可以静态或者动态的添加到Activity中,其中静态情况下,直接在layout.xml中添加fragment节点,并指定android:name属性就可以启动相应的fragment.

    动态添加

    可以在Activity中通过覆盖onCreate()函数来动态添加Fragment

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            if (savedInstanceState == null){
                getSupportFragmentManager().beginTransaction().add(R.id.container, new MainFragment()).commit();
            }
        }

    动态替换:

    在Fragment中可以通过添加按钮事件接收器覆盖当前的fragment:

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            // Inflate the layout for this fragment
            View rootView = inflater.inflate(R.layout.fragment_main, container, false);
    
            rootView.findViewById(R.id.btnShowAnotherFragment).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    getFragmentManager().beginTransaction()
                            .addToBackStack(null)
                            .replace(R.id.container, new AnotherFragment())
                            .commit();
                }
            });

    注意,一个静态添加的Fragment,通过这种动态的方法进行替换会造成两个Fragment在Framelayout中的重叠。

    生命周期:

    当一个B Fragment被另一个A fragment启动的时候会执行B oncreate, A onPause, A onDestroyView,B oncreateview

    这个A Fragment并不会执行A onDestroy。

    当按Back键返回时会执行B onPause, B onDestroyView, B onDestroy销毁, A onCreateView。

    碎片与活动的通信

    关于这个问题有一片文章总结的比较好:Android:Activity与Fragment通信(99%)完美解决方案

    要想在活动中得到碎片的实例,需要调用FragmentManager的findFragmentById()函数,反过来如果想在碎片中得到活动的实例需要调用getActivity()函数。

    如果fragment需要调用activity的函数,则需要保存activity的实例,并定义一个接口,让activity去实现,这样就可以通过fragment保存的实例去调用了。这样做的主要问题是耦合太多,如果activity改变,比如被删除了,那么fragment的代码也需要被更改。

    解决方法

    定义一个baseFragment类,在其中保存 一个baseActivity类的实例。baseActivity的功能是有一个回调函数可以在baseFragment被onAttach的时候调用,这个函数会将所有的会被fragment调用的函数添加到一个HashMap中,只要在Activity中实现了这个接口,就可以保证在onAttach的时候被添加进来。添加机制定义好之后,只要在我们要定义的activity中实现这个接口,那么就一定会被包含在我们的HashMap中,以供调用。 一个Functions实例。Functions实例就是我们保存HashMap的地方。 当调用的时候,会直接取得这个实例并进行调用。 至此,Activity通过固定的接口进行添加接口函数以供fragment调用,当添加删除Activity的时候Fragment完全不需要改动,当这个fragment被attach到哪一个activity的时候它所能进行的调用就都由Activty侧定义了,fragment要做的就是发起调用,说白了就是以 固定的方式进行activity和fragment之间的函数调用,没啥意思。

    其他

    当一个Activity执行onPause()的时候,这个Activity中所有的Fragment都会执行onPause() 当一个Fragment被作为layout的Item添加进来的时候,是不可以被删除的 所有的Fragment之间的通信都是靠Activity,两个Fragment之间不能直接通信。

  • 相关阅读:
    [置顶网]POWER 9为云与智能打造强大引擎
    [丁香医生]百亿保健帝国权健,和它阴影下的中国家庭---保存一下
    【菜鸟】RESTful 架构详解
    搞笑三问
    [置顶网] 世界服务器出货量
    [51CTO]新说MySQL事务隔离级别!
    Win2008r2 由ESXi 转换到 HyperV的处理过程
    Postgresql迁移数据文件存放位置
    极简版 卸载 home 扩充 根分区--centos7 xfs 文件格式
    CentOS下面磁盘扩容处理
  • 原文地址:https://www.cnblogs.com/dracohan/p/5840022.html
Copyright © 2011-2022 走看看