【问题标题】:Android rotation: Why fragment not restored by TAG?Android 轮换:为什么 TAG 无法恢复片段?
【发布时间】:2014-10-04 12:41:55
【问题描述】:

我有一个名为 MainActivity 的活动,其中有一个名为“HomeFragment”的片段。我想在屏幕旋转后恢复片段,但是似乎缺少一些东西。 我遵循以下流程:

  1. onSaveInstanceState 期间使用getSupportFragmentManager().putFragment(...) 保存片段
  2. 尝试在 onCreate 期间通过fragmentManager.findFragmentByTag 恢复片段(在检查该捆绑包不为空之后)

但是findFragmentByTag 返回 null。

这是 MainActivity 中的代码 sn-ps:

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Set up the action bar to show a dropdown list.
        final ActionBar actionBar = getSupportActionBar();
        actionBar.setDisplayShowTitleEnabled(false);
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
        setupNavigationSpinner(actionBar);
        FragmentManager fragmentManager = getSupportFragmentManager();

        if (savedInstanceState != null) {

            if (fragmentManager.findFragmentByTag("frag") != null) { 
                //  findFragmentByTag always return null
                homeFragment = (HomeFragment) fragmentManager
                        .findFragmentByTag(HomeFragment.ARG_ITEM_ID);
                contentFragment = homeFragment;
            }else{
                homeFragment = new HomeFragment();
                switchContent(homeFragment, HomeFragment.ARG_ITEM_ID);
            }
        } else {
            homeFragment = new HomeFragment();
            switchContent(homeFragment, HomeFragment.ARG_ITEM_ID);
        }

}


@Override
public void onSaveInstanceState(Bundle outState) {
    getSupportFragmentManager().putFragment(outState, "frag",homeFragment );
}

public void switchContent(Fragment fragment, String tag) {
    FragmentManager fragmentManager = getSupportFragmentManager();
    while (fragmentManager.popBackStackImmediate())
        ;

    if (fragment != null) {
        FragmentTransaction transaction = fragmentManager
                .beginTransaction();
        transaction.replace(R.id.content_frame, fragment, tag);
        // Only ArticlDetailFragment is added to the back stack.
        if (!(fragment instanceof Fragment)) {
            transaction.addToBackStack(tag);
        }
        transaction.commit();
        contentFragment = fragment;
    }
}

【问题讨论】:

  • 由于某种原因我遇到了同样的问题。
  • 呃...你可能想告诉我们switchContent发生了什么。
  • HomeFragment.ARG_ITEM_ID 是否等于 "frag"?你为什么要检查"frag"?如我所见,您正在用HomeFragment.ARG_ITEM_ID 标签替换您的片段。

标签: android android-fragments screen-rotation onrestoreinstancestate


【解决方案1】:

没有理由打电话

getSupportFragmentManager().putFragment(outState, "frag",homeFragment );

Fragment 状态将自动恢复。问题是您没有调用onSaveInstanceState 的超级用户。它应该看起来像这样:

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
}

另外,您将标签设置为HomeFragment.ARG_ITEM_ID,然后查找"frag"HomeFragment.ARG_ITEM_ID == "frag"吗?

【讨论】:

  • 我只是将键更改为“FRAG”以检查可能的错误,但主要问题是,正如您所注意到的,关于调用 `super.onSaveInstanceState(outState);`
  • @VSB 太好了。 :-) 如果它解决了您的问题,请记住接受这个答案。
猜你喜欢
  • 2018-02-10
  • 2014-01-28
  • 1970-01-01
  • 1970-01-01
  • 2013-04-04
  • 2014-04-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多