使用Fragment,每次显示Fragment的时候都要回调onCreateView()这个比较费时的方法么?

发布于 2022-09-02 09:33:49 字数 509 浏览 11 评论 0

当创建一个Fragment时,必须得重写public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)这个方法返回界面内容。
在这里做的界面上的设置算是比较费时的,但是不管是使用Activityreplace方法或是ViewPagerFragmentPageAdapter系统都会销毁Fragment(走到onDestroyView()),然后再创建onCreateView()
我现在的疑问就是Android为什么要这么设计Fragment呢,很多应用的首页都是使用Fragment和标签切换的,如果这么做岂不是浪费CPU而且切换会不流畅?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

寂寞陪衬 2022-09-09 09:33:49

FragmentPagerAdapter实现将Fragment detach和attach, 因为Android认为如果一个Fragment不需要展示, 则需要将UI从整个View树下移除, 这样才不会造成界面元素过多, 绘制时间增长, 导致界面卡顿. 你可以在你的Fragment里面用一个变量在onDestoryView的时候将View保存下来, 然后在下一次onCreateView的时候, 判断该变量是否为空, 如果不为空则直接返回该变量, 而不是从新创建View

我不会写诗 2022-09-09 09:33:49

onCreateView 只是负责创建页面,没理由数据加载也放在里面嘛

李白 2022-09-09 09:33:49

试试下面参考链接的思路:
切换Fragment时避免UI重新加载

private View rootView;// 缓存Fragment view

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
      Bundle savedInstanceState)
  {
    Log.i(TAG, "onCreateView");

    if (rootView == null)
    {
      rootView = inflater.inflate(R.layout.fragment_1, null);
    }
    // 缓存的rootView需要判断是否已经被加过parent,如果有parent需要从parent删除,要不然会发生这个rootview已经有parent的错误。
    ViewGroup parent = (ViewGroup) rootView.getParent();
    if (parent != null)
    {
      parent.removeView(rootView);
    }
    return rootView;
  }
阳光下慵懒的猫 2022-09-09 09:33:49

可以使用show()和hide()方法 每次执行逻辑的时候将所有fragment全部隐藏 之后判断fragment实例是否已经存在 存在 调用show()方法 不存在实例化相应fragment并add() 这样可以减少fragment实例的创建。FragmentPagerAdapter的情况 fragment页数多的时候使用FragmentStatePagerAdapter。

`...
          FragmentUtil.hideFragment(fragmentTransaction,testFragment);
           .... 
            if (testFragment != null) {
                fragmentTransaction.show(testFragment);
            } else {
                testFragment = new TestFragment();
                fragmentTransaction.add(R.id.container_linear, testFragment);
            }
   ....         
  public static void hideFragment(FragmentTransaction ft, Fragment... params) {
    if (ft!=null&¶ms != null && params.length > 0) {
        for (int i = 0; i < params.length; i++) {
            if (params[i] != null) {
                ft.hide(params[i]);
            }
        }
     }
  }
        
            `
煮茶煮酒煮时光 2022-09-09 09:33:49

除了replace,还有hide, show方法,ViewPager + Fragment,adapter用FragmentStatePagerAdapter,可以避免大多数情况下Fragment被销毁重建。

[浮城] 2022-09-09 09:33:49

如果费时则说明你写的代码有问题,那样会阻塞界面。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文