我怎样才能阻止我的片段被销毁?

Moy*_*nul 3 android android-fragments

我有一个导航视图,其中包含一些项目,当按下一个项目时,它将转到该片段。例如,如果您按下抽屉上的“主页”项,它会调出主页片段。

        navigationView = (NavigationView)findViewById(R.id.navigation_view);
        navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(MenuItem item) {
            switch (item.getItemId()) {
                case R.id.home_id:
                    HomeFragment homeFragment = (HomeFragment) fragmentManager.findFragmentByTag("Home");
                    if (homeFragment == null)
                        homeFragment = new HomeFragment();
                    fragmentTransaction = fragmentManager.beginTransaction();
                    fragmentTransaction.replace(R.id.Main, homeFragment, "Home");
                    fragmentTransaction.commit();
                    getSupportActionBar().setTitle("Home");
                    item.setChecked(true);
                    drawerLayout.closeDrawers();
                    break;

                case R.id.chat_id:
                    ChatFragment chatFragment = (ChatFragment) fragmentManager.findFragmentByTag("Chat");
                    if (chatFragment == null)
                        chatFragment = new ChatFragment();
                    fragmentTransaction = fragmentManager.beginTransaction();
                    fragmentTransaction.replace(R.id.Main, chatFragment, "Chat");
                    fragmentTransaction.commit();
                    getSupportActionBar().setTitle("Chat");
                    item.setChecked(true);
                    drawerLayout.closeDrawers();
                    break;
            }

        }
    }
Run Code Online (Sandbox Code Playgroud)

所以我认为正在发生的是,当我使用该replace()方法时,它正在破坏聊天片段。如果我有关于聊天片段的数据,并且我想确保更改片段时数据不会消失怎么办。

ChatFragment类中,我放置了这个覆盖方法:

@Override
public void onSaveInstanceState(Bundle outState)
{
    Log.d("CHATFRAG", "onSaveInstanceState: been called ");
    super.onSaveInstanceState(outState);
    outState.putString("textView",textView.getText().toString());
    //Save the fragment's state here
}
Run Code Online (Sandbox Code Playgroud)

现在,当我在应用程序中的片段之间切换时,不会调用此方法,这意味着片段正在被销毁。

有没有替代方法可以将屏幕上的当前片段与所需的片段(不破坏两者)交换?我将拥有更多片段(最多 10 个),是否有不需要重复代码的优化解决方案?

Rav*_*avi 8

你正在用其他替换片段,所以第一个会被破坏。如果你不想它破坏你需要add它而不是replace

fragmentTransaction.add(R.id.Main, homeFragment, "Home");
Run Code Online (Sandbox Code Playgroud)