美文网首页IT圈AndroidAndroid开发
Android开发之Fragment动态使用

Android开发之Fragment动态使用

作者: YungFan | 来源:发表于2016-03-29 09:14 被阅读1806次

    Android开发之奇怪的Fragment 一文中,讲到了Fragment的基础知识,这次来重点讨论一下Fragment的动态使用。这种情况主要针对布局文件中用占位符,在Activity中进行切换Fragment的情况,分为两种:

    • 1、使用replace方法把原有的Fragment替换掉;
    • 2、使用hideshow方法,把已经添加过的Fragment再次隐藏或显示出来。

    下面主要探讨一下这两种情况之间的区别

    1、使用replace方法把原有的Fragment替换掉

    public class MainActivity extends ActionBarActivity implements OnClickListener
    {
    
        private Button ott, tto;
        Fragment1 f1;
        Fragment2 f2;
    
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            ott = (Button) findViewById(R.id.ott);
            tto = (Button) findViewById(R.id.tto);
    
            ott.setOnClickListener(this);
            tto.setOnClickListener(this);
    
            f1 = new Fragment1();
            f2 = new Fragment2();
            FragmentTransaction ft = getFragmentManager().beginTransaction();
            ft.add(R.id.fl, f1);
            ft.commit();
        }
    
        @Override
        public void onClick(View arg0)
        {
            if (arg0.getId() == R.id.ott)
            {
    
                FragmentTransaction ft = getFragmentManager().beginTransaction();
                ft.replace(R.id.fl, f2);
                ft.commit();
    
            }
            else if (arg0.getId() == R.id.tto)
            {
    
                FragmentTransaction ft = getFragmentManager().beginTransaction();
                ft.replace(R.id.fl, f1);
                ft.commit();
    
            }
        }
    }
    
    

    这种情况

    (1)程序刚刚启动


    replace init.PNG

    (2)Fragment1 ——>Fragment2,生命周期为:

    replace oneTtwo.PNG

    (3)Fragment2 ——>Fragment1,生命周期为:

    replace twoTone.PNG

    (4)再次Fragment1 ——>Fragment2,生命周期为:


    replace oneTtwo.PNG

    如上,若频繁地replace Fragment来切换,会不断创建新实例,销毁旧的,浪费资源,无法重用。

    使用场景:如果被替换的Fragment无须再次使用,可以使用replace方法。

    </br>


    2、使用hideshow方法,把已经添加过的Fragment隐藏或显示出来。

    public class MainActivity extends ActionBarActivity implements OnClickListener
    {
    
        private Button ott, tto;
        Fragment temp;
        Fragment1 f1;
        Fragment2 f2;
    
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            ott = (Button) findViewById(R.id.ott);
            tto = (Button) findViewById(R.id.tto);
    
            ott.setOnClickListener(this);
            tto.setOnClickListener(this);
    
            f1 = new Fragment1();
            f2 = new Fragment2();
            FragmentTransaction ft = getFragmentManager().beginTransaction();
            ft.add(R.id.fl, f1);
            ft.commit();
    
            temp = f1;
        }
    
        @Override
        public void onClick(View arg0)
        {
            if (arg0.getId() == R.id.ott)
            {
                switchFragment(f2);
    
            }
            else if (arg0.getId() == R.id.tto)
            {
                switchFragment(f1);
    
            }
        }
    
        /**
         * hide和show切换Fragment
         * 
         * @param fragment
         */
        private void switchFragment(Fragment fragment)
        {
            // temp默认为Fragment1
            if (fragment != temp)
            {
                if (!fragment.isAdded())
                {
                    getFragmentManager().beginTransaction().hide(temp)
                            .add(R.id.fl, fragment).commit();
                }
                else
                {
                    getFragmentManager().beginTransaction().hide(temp)
                            .show(fragment).commit();
                }
                temp = fragment;
            }
        }
    }
    
    

    此时情况会发生什么变化呢?
    (1)程序刚刚启动

    hideAndShow init.PNG

    (2)Fragment1 ——>Fragment2,生命周期为:

    hideAndShow oneTtwo.PNG

    (3)Fragment2 ——>Fragment1,不打印任何生命周期
    (4)再次Fragment1 ——>Fragment2,不打印任何生命周期

    使用场景:如果Fragment需要重用或者不断切换,可以使用该方法提高性能。

    相关文章

      网友评论

      • dotdog:总之搜索了好多stack overflow的文章,其中有一个人行文方式和您这篇文章类似。他说situation,你说场景。Good。一股脑地说该怎么样怎么样真的很Low。
        YungFan:@dotdog :scream::scream::scream:好吧
        dotdog:@YungFan 你误会了,就是说你不low..
        YungFan:@dotdog 你想表达什么?怎么样才不low?
      • 锄小杨:三星的机器。就是2个framment 重叠了。我感觉是内存低 释放导致的
        YungFan:@锄禾禾 那就要具体问题具体对待了,比如加载数据不要一次性全部加载,能缓存就缓存...
        锄小杨:@YungFan 确实。有个是首页。用的。不知道怎么弄
        YungFan:@锄禾禾 如果是卡顿造成的,那你看看你的Fragment是不是太重了
      • 锄小杨:我在个别手机一直有重影
        YungFan:@锄禾禾 什么重影?哪个机型?
      • LITTLEDREAM:ViewPage+Fragment,是使用的那种形式?
        YungFan:@LITTLEDREAM 根据不同的Adapter,实现方式不一样,可以看一下 Android开发之ViewPager+Fragment 一文
      • TangKe:为啥不用detach和attach方法呢,这样可以把fragment对应的view从view树上移除, hide和show只是单纯的隐藏和显示,view还是会参与测量和布局
        YungFan:@TangKe 嗯,计划写一篇关于FragmentAdapter的。
        TangKe:@YungFan 嗯,这样对view tree的性能有提升,至少测量和布局不回遍历你fragment的view了。FragmentPagerAdapter就是这样实现的
        YungFan:@TangKe 使用detach()确实会将view从viewtree中删除,再使用attach()时会再次调用onCreateView()来重绘视图,有机会再深入研究一下你说的两个 :smile:

      本文标题:Android开发之Fragment动态使用

      本文链接:https://www.haomeiwen.com/subject/tsfslttx.html