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