美文网首页Android面试题
Android面试(二)Fragment

Android面试(二)Fragment

作者: 小龙哥的开发日记 | 来源:发表于2017-07-24 15:57 被阅读48次

    1 fragment加载到Activity的两种方式
    1 添加fragment到activity的布局文件当中
    2 动态在activity中添加fragment


    2 fragmentPagerAdapterFragmentStatePagerAdapter区别?

    • FragmentPagerAdapter:该类内的每一个生成的 Fragment 都将保存在内存之中,因此适用于那些相对静态的页,数量也比较少的那种;如果需要处理有很多页,并且数据动态性较大、占用内存较多的情况,应该使用FragmentStatePagerAdapter


      解绑定而已
    • FragmentStatePagerAdapter:该 PagerAdapter 的实现将只保留当前页面,当页面离开视线后,就会被消除,释放其资源;而在页面需要显示时,生成新的页面(就像 ListView 的实现一样)。这么实现的好处就是当拥有大量的页面时,不必在内存中占用大量的内存。


      这里写图片描述

    3fragment通信
    frgment调用activity方法 - getActivity(获取绑定在一起的activity的实例)
    activity调用fragment方法 - 接口回调
    fragment中调用fragment中的方法 - findFragmentById(找到相应的fragment)


    4Fragment 的 replace 和 add 方法的区别
    add 的时候是把所的 Fragment 一层一层的叠加到了FrameLayout 上了,
    replace的首先将该容器中的其他 Fragment 去除掉然后将当前 Fragment
    添加到容器中。


    5fragment的生命周期

    这里写图片描述
    Fragment onCreate 执行完成后才创建Activity
    Fragment onViewCreated 执行完Activity才执行onCreate
    Fragment onActivityCreated ----> Activity onStart
    Fragment onStart ---> Activity onResume
    Fragment onPause ---> Activity onPause
    Fragment onStop ---> Activity onStop
    Fragment onDetach ---> Activity onDestory
    Fragment懒加载分析
    场景:一个Activity内使用ViewPager包含多个Fragment的情况。由于ViewPager的预加载功能,通过setOffscreenPageLimit(int number) 来设置预加载,默认的预加载是1,但是即使你设置为0,也是不起作用的,设置的只能是大于1才会有效果。这无疑会为性能上带来很大影响。解决这个问题有两种方式,一种是禁止ViewPager的预加载,重写ViewPager,但是该方法会出现左右滑动时会出现卡顿现象,带来不好的用户体验。而另外一种就是我们接下来要讲的通过Fragment的懒加载来实现。当用户切换到某个fragment时再加载。
    //通过判断当前的fragment是否可见来判断是否加载网络
        @Override
        public void setUserVisibleHint(boolean isVisibleToUser) {
            super.setUserVisibleHint(isVisibleToUser); 
           if (getUserVisibleHint()) {
                isVisable = true; 
               onVisible();
            } else {
                isVisable = false;
                onInVisible();
            } 
       }
        protected void onInVisible() {
        }
        protected void onVisible() {
            //加载数据
            loadData();
        } 
       protected abstract void loadData();
    

    Fragment嵌套Fragment界面不显示或加载不完整
    fragment嵌套fragment,调用getChildFragmentManager

     fm = fragment.getChildFragmentManager();
     
     FragmentTransaction ft = fm.beginTransaction();
     
     for(Fragment fragment : fragments) {
         ft.add(containerId, fragment);
     }
     
     ft.commit();
    

    fragment之添加回退栈
    场景:类似与Android系统为Activity维护一个任务栈,我们也可以通过Activity维护一个回退栈来保存每次Fragment事务发生的变化。如果你将Fragment任务添加到回退栈,当用户点击后退按钮时,将看到上一次的保存的Fragment。一旦Fragment完全从后退栈中弹出,用户再次点击后退键,则退出当前Activity
    //添加到任务栈
    FragmentTransaction.addToBackStack(String)
    //获取任务栈数量
    getFragmentManager().getBackStackEntryCount()
    //弹出任务栈
    getFragmentManager().popBackStack();

    Fragment2 f2 = new Fragment2();
    FragmentManager fm = getFragmentManager();
    FragmentTransaction tx = fm.beginTransaction();
    tx.replace(R.id.fl, f2);
    //将当前的事务添加到了回退栈
    tx.addToBackStack(null);
    tx.commit();
    
    //回退到Fragment1
    FragmentManager fm = getFragmentManager();
    //将当前的事务退出回退栈
    fm.popBackStack();
    

    相关文章

      网友评论

        本文标题:Android面试(二)Fragment

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