【问题标题】:When do Fragments have non-empty savedInstanceStateFragments 什么时候有非空的 savedInstanceState
【发布时间】:2015-09-15 12:08:54
【问题描述】:

我在 ViewPager 中有一个片段。 Fragment 包含一个 RecyclerView(想想 ListView)。当用户翻页然后返回片段时,无论用户离开列表的哪个位置,列表总是从顶部重新开始。所以我需要以某种方式保留currPosition。 savedInstanceState 是存储它的好地方吗?如果是,我在哪个回调中读取数据?同样,这是在 ViewPager 中,我使用的是 FragmentPagerAdapter,因此调用的回调并不多。我的更广泛的问题仍然存在:是什么导致 Fragment 的 savedInstanceState 不为空?

进一步扩大问题的范围。想象一下,我有一个包含两个片段的活动。我在需要时分离并附加碎片。假设我离开活动。如果活动的 savedInstanceState 不为空,在这种情况下,片段的 savedInstanceState 是否会为空?确切地说,这里是第二种情况的一些代码

private void addMainFragment() {
    
  FragmentManager fm=getSupportFragmentManager();

      FragmentTransaction transaction = fm.beginTransaction();

      Fragment removeFragment = fm.findFragmentByTag(getString(R.string.fragment_a));

      if(null != removeFragment){
    
    transaction.detach(removeFragment);

      }
    
  Fragment fragment = fm.findFragmentByTag(getString(R.string.fragment_b));

      if(null != fragment){

        transaction.attach(fragment);

      }else{
    
    fragment=MainFragment.newInstance(null,null);

交易。 添加(R.id.fragment_container,片段,getString(R.string.fragment_b)); }
事务.commit(); }

【问题讨论】:

  • 它被用于在诸如方向变化之类的事情上重新创建一个片段(类似于它在活动中的处理方式)。 stackoverflow.com/questions/15313598/… 应该可以帮助您了解情况,但要点是您明确保存您的状态,以便您可以明确恢复它。
  • 不错的链接。但我在那里看不到我的案子。不过,谢谢。
  • 这只是你如何使用 savedInstanceState 的链接,我认为这不是你在这种情况下需要的。

标签: android android-fragments bundle


【解决方案1】:

savedInstanceState 是保存当前位置、所选项目等信息的最佳位置。

查看分页器有一个屏幕外页面限制,用于处理当前可见页面两侧保持空闲的页面(在本例中为片段)的数量。如果页面超出此限制,则页面将被销毁。这是为了降低内存使用率。此设置默认为 1。因此,当片段超出此限制然后返回时,其 savedInstanceState 将是非空的。

回答你的第二个问题。我不太清楚你所说的离开活动是什么意思。如果您离开活动(例如按返回/主页按钮)然后回来。活动 savedInstanceState 将为空。 如果您在当前活动之上启动另一个活动,则将调用 onSavedInstance。

这是我在我的一个项目中使用的代码 sn-p,用于在 viewpager 中恢复片段状态。

您可以覆盖onSaveInstanceState 以保存有关片段的一些信息。

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

    // restore state
    mListState = mLayoutManager.onSaveInstanceState();
    state.putParcelable("list_state", mListState);
}

然后在片段onCreateView可以恢复recyclerview的状态

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

    ...

    if (savedInstanceState != null) {
        // save list state
        mListState = state.getParcelable("list_state");
        mLayoutManager.onRestoreInstanceState(mListState);
    }

    return root;
}

【讨论】:

  • 离开活动意味着开始另一个活动,然后从另一个开始的活动返回。感谢您的输入。 +1。
  • 如果你在顶部开始另一个活动,那么保存的实例将被调用
猜你喜欢
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-22
  • 2021-11-12
  • 1970-01-01
相关资源
最近更新 更多