gpt4 book ai didi

android - Fragments 什么时候有非空的 savedInstanceState

转载 作者:行者123 更新时间:2023-11-30 01:53:52 24 4
gpt4 key购买 nike

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

进一步扩大问题的广度。想象一下我有一个包含两个 fragment 的 Activity 。我在需要时分离并附加 fragment 。假设我离开了 Activity 。如果 Activity 的 savedInstanceState 不为空, fragment 的 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, fragment ,getString(R.string.fragment_b));
交易.commit();

最佳答案

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

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

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

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

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

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

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

然后在 fragment onCreateView中你可以恢复recycelerview的状态

@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;
}

关于android - Fragments 什么时候有非空的 savedInstanceState,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32575186/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com