Android 为什么replace()方法会保存片段的状态?
我有一个Android 为什么replace()方法会保存片段的状态?,android,android-fragments,android-recyclerview,fragment-backstack,Android,Android Fragments,Android Recyclerview,Fragment Backstack,我有一个BottomNavigationView在4个片段之间导航,第一个有一个RecyclerView。当我选择BottomNavigationView的一个项目时,我使用replace()方法在片段之间切换。我不明白的是,为什么当我滚动RecyclerView时,转到另一个片段并使用RecyclerView返回片段,滚动位置保持与我离开片段时相同,而不是回到RecyclerView的顶部。由于我使用的是replace(),并且没有添加到backbackback中,所以片段不应该被重置吗?这是
BottomNavigationView
在4个片段之间导航,第一个有一个RecyclerView
。当我选择BottomNavigationView
的一个项目时,我使用replace()
方法在片段之间切换。我不明白的是,为什么当我滚动RecyclerView
时,转到另一个片段
并使用RecyclerView
返回片段
,滚动位置保持与我离开片段时相同,而不是回到RecyclerView
的顶部。由于我使用的是replace()
,并且没有添加到backbackback中,所以片段不应该被重置吗?这是我的密码:
private void initializeFragments() {
homeFragment = new HomeFragment();
feedFragment = new FeedFragment();
chatFragment = new ChatFragment();
profileFragment = new ProfileFragment();
fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.fragment_container, homeFragment, "home")
.commit();
}
看起来您正在重用相同的片段实例,这在重新添加它们时会导致一些怪癖,在您的情况下,片段视图保存状态被还原(不要与片段保存状态混淆)。好的,我想我明白了,我可以这样做吗,还是不应该每次更改片段时都使用相同的片段实例?你能解释一下这些保存状态之间的区别吗?感谢您除了片段savedInstanceState
还有它的视图保存状态-但是它完全在内部处理,您不能更改它。当您的片段被删除时,片段管理器确实不会存储其状态(您将在onCreate
期间收到null
),但片段实例本身将最后一个视图保存状态保存在内部变量中,它将用于在创建后恢复视图状态。谢谢,我现在理解了
private void setupBottomNavigation() {
bottomNavigationView.setOnNavigationItemSelectedListener(item -> {
FragmentTransaction ft = fragmentManager.beginTransaction();
if (item.getItemId() == R.id.bottom_nav_home) {
ft.replace(R.id.fragment_container, homeFragment, "home")
.commit();
} else if (item.getItemId() == R.id.bottom_nav_feed) {
ft.replace(R.id.fragment_container, feedFragment, "feed")
.commit();
} else if (item.getItemId() == R.id.bottom_nav_chat) {
ft.replace(R.id.fragment_container, chatFragment, "chat")
.commit();
} else if (item.getItemId() == R.id.bottom_nav_profile) {
ft.replace(R.id.fragment_container, profileFragment, "profile")
.commit();
}
return true;
});