如何阻止我的碎片被摧毁?

时间:2016-04-07 13:50:33

标签: android android-fragments

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

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

        }
    }

所以我认为正在发生的是当我使用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
}

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

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

3 个答案:

答案 0 :(得分:3)

您可以提前创建片段,例如在活动的onCreate()方法中

private HomeFragment homeFragment;
private ChatFragment chatFragment;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.my_activity);

    homeFragment = new HomeFragment();
    chatFragment = new ChatFragment();
}

然后在导航代码中:

@Override
public boolean onNavigationItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.home_id:
            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:
            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;
    }
}

答案 1 :(得分:3)

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

fragmentTransaction.add(R.id.Main, homeFragment, "Home");

答案 2 :(得分:1)

虽然我认为Ravi Rupareliya的答案是最佳选择(使用.add),但我会分享另一种我认为可行的方法。

您可以将两个FrameLayout添加到彼此之上,.add一个Fragment两个,然后替换它们的可见性。