【问题标题】:OnCreateView called multiple times / Working with ActionBar and FragmentsOnCreateView 多次调用/使用 ActionBar 和 Fragments
【发布时间】:2012-08-25 11:10:52
【问题描述】:

我将我的应用程序的一部分从活动切换到片段,以便我可以使用整洁的 ActionBar 选项卡。

但是,在完成转换后,我遇到了一个问题:每当我切换到另一个选项卡时,都会重新创建该 Fragment。每次进入选项卡时都会调用 onCreate 和 onCreateView。

我有 4 个选项卡,每个选项卡都用于打开以下片段之一:

Fragment ShopFragment = new WebActivity();
Fragment SearchFragment = new SearchActivity(context);
Fragment StoreFragment = new StoreLocatorActivity(context, this);
Fragment BlogsFragment = new BlogsActivity(context, this);

这是我的监听器代码:

    class MyTabsListener implements ActionBar.TabListener {
        public Fragment fragment;

        public MyTabsListener(Fragment fragment) {
            this.fragment = fragment;
        }

        @Override
        public void onTabReselected(Tab tab, FragmentTransaction ft) {
            ft.hide(fragment);
        }

        @Override
        public void onTabSelected(Tab tab, FragmentTransaction ft) {
            ft.replace(R.id.fragment_container, fragment);
        }

        @Override
        public void onTabUnselected(Tab tab, FragmentTransaction ft) {          

        }

    }

有人可以指点我正确的方向吗?

【问题讨论】:

  • 有人知道我该如何处理吗?

标签: android android-fragments android-activity android-actionbar


【解决方案1】:

当您调用FragmentTransaction.replace(...) 时,Android 将有效地执行FragmentTransaction.remove(...)(针对当前添加到该容器的所有片段)和FragmentTransaction.add(...)(针对您提供的片段)的序列。从FragmentManager 中删除 Fragment 将导致 Fragment 被销毁并且其状态将不再被管理。最值得注意的是,当您重新添加片段时,所有视图都将被重置。注意:由于您正在重用同一个 Fragment 实例,因此 Fragment 仍将保留任何实例变量的值。

解决此问题的一种方法是在切换时使用FragmentTransaction.detach(Fragment)FragmentTransaction.attach(Fragment)。这将导致片段视图被重新创建(onDestroyView()onCreateView() 将被调用),但实例状态包将被保存并在调用之间返回给您,因此可以保持视图状态。这是FragmentPagerAdapter尝试在Fragment之间切换时采用的方法。

或者,您可以允许 Fragment 被销毁,但独立地为它们维护它们的保存状态。这将使用更少的内存,但会以更慢的切换时间为代价。注意的方法是FragmentManager.saveFragmentInstanceState(Fragment)FragmentManager.setInitialSavedState(Fragment.SavedState),以及添加/删除。这是FragmentStatePagerAdapter采取的方法。

您可以查看source for FragmentPagerAdaptersource for FragmentStatePagerAdapter 以获得实施提示。

【讨论】:

  • 这是一种解决方法。 onCreate 和 onCreateView 仍在被调用,保存状态需要做很多工作。有没有办法只保留 wach 片段的已绘制视图并替换它们?为什么要重新粉刷一遍?
  • 您好,我正在使用 ActionBar 选项卡并使用附加和分离!您能否用一些示例代码解释一下如何在切换到其他选项卡时保存实例状态,然后在返回选项卡时保持状态!谢谢
  • @kilaka 你能解释一下你是如何让saving state工作的吗?
  • @MuhammadBabar - 不知道。我使用显示/隐藏 - stackoverflow.com/a/14033244/435605
  • @kilaka 但分离和附加比显示和隐藏更有效。我猜!
【解决方案2】:

show/hide 选项只是为了不需要重新绘制/重新创建片段,并且不会重新调用onCreate()onCreateView()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多