【问题标题】:Android - How to save state of fragment before replacing with another fragment?Android - 如何在用另一个片段替换之前保存片段的状态?
【发布时间】:2014-05-12 14:16:57
【问题描述】:

我在片段“A”调用中从服务器获取数据。当我用“B”替换“A”时,从“B”回到“A”后,每次都会调用片段“A”,所以每次都会生成HTTPGET。如何避免这种情况并在活动中重用 REORDER_TO_FRONT 之类的片段?

我正在使用此代码替换新片段

FragmentTransaction transaction = getSupportFragmentManager()
                .beginTransaction();
transaction.replace(R.id.rl_fragment_content, newFragment,
                backStackName);
transaction.addToBackStack(backStackName);
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
        transaction.commit();

当我反击时,

  Fragment fragment = null;
        fragment = getSupportFragmentManager().findFragmentByTag(
                    "some_fragment_name");
        FragmentTransaction transaction = getSupportFragmentManager()
                .beginTransaction();

        transaction.replace(R.id.rl_fragment_content, fragment);
        transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
        transaction.addToBackStack("some_fragment_name");
        transaction.commit();

【问题讨论】:

  • 您不会将您加载的数据保存在某处吗?然后,您可以简单地检查数据是否已经存在。或者,您可以在 SharedPreferences 中保留一个布尔标志,无论数据是否已下载。
  • 更多关于在添加到后台堆栈时保存片段状态的信息stackoverflow.com/questions/11353075/…

标签: android android-fragments


【解决方案1】:

只是防止您的片段通过使用重新膨胀视图,

if (view != null) {
//this will prevent the fragment from re-inflating(when you come back from B) 
            ViewGroup parent = (ViewGroup) view.getParent();
            parent.removeView(view);
        } else {
//inflate the view and do what you done in onCreateView()
        }

【讨论】:

  • 嗨。据我了解,在这种情况下,视图将持续存在而片段持续存在。我对吗?如果这是真的,那么解决方案看起来有点奇怪。有很多碎片,会导致高内存消耗。我说的对吗?
  • 如果需要,视图将被删除。所以不用担心你提到的情况..
【解决方案2】:

有几种方法可以做到这一点,但最简单的方法是在片段上使用添加和隐藏而不是替换。此代码(未经测试)将显示 newFragment2 并将 newFragment1 添加到后台堆栈。在您的 backstack 代码中将显示 newFragment1 并将您想要的任何内容添加到 backstack

FragmentTransaction transaction = getSupportFragmentManager()
            .beginTransaction();
transaction.add(R.id.rl_fragment_content, newFragment1,
            backStackName1); //now you have an instance of newFragment1
transaction.add(R.id.rl_fragment_content, newFragment2,
            backStackName2); //now you have an instance of newFragment2
transaction.addToBackStack(backStackName1);
transaction.show(newFragment2);
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
transaction.commit();

以后

Fragment fragment = null;
fragment = getSupportFragmentManager().findFragmentByTag(
            backStackName1);
FragmentTransaction transaction = getSupportFragmentManager()
        .beginTransaction();

transaction.show(fragment)
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
transaction.addToBackStack("whatever_you_want");
transaction.commit();

请注意,这将保留视图。如果你想在屏幕旋转之间保持不变,你需要在你的宿主 Activity 中实现一个 Bundle。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    • 2021-04-21
    • 2017-03-30
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    相关资源
    最近更新 更多