导航视图片段和儿童backstack

时间:2017-09-30 08:23:02

标签: android android-fragments back-stack

我之前处理过片段,但是有了一个视图寻呼机和tablayout,我能够通过构建一个数组并从该数组中返回一个片段来保持片段的状态。

但现在使用片段管理器,我可以访问添加和替换,但两者都创建我的片段的新实例而不保存已发生的事件(即在editText上键入)。

如何保留或重复使用从菜单导航时创建的片段(请记住,这些片段中的一些片段会有一个儿童背包,后面的按钮应该只会让您从深层片段中取出而不是我的主要片段的)

当前代码

 private void initNavigation(){
    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

    /* Initialize fragments for navigation drawer */
    fragments = new Fragment[]{
            new ProfileFragment(),
            new StatsFragment()};

    /* Set selection of navigation item */
    nav_view = (NavigationView) findViewById(R.id.nav_view);
    nav_view.setNavigationItemSelectedListener(
            new NavigationView.OnNavigationItemSelectedListener() {
                @Override
                public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                    item.setChecked(true);

                    FragmentManager fragmentManager = getSupportFragmentManager();
                    switch (item.getItemId()) {
                        case R.id.nav_routine:
                            if(fragmentManager.findFragmentByTag("TAG0") != null){
                                Log.i("fm", "reloading profile frag");
                                fragmentManager.beginTransaction().replace(R.id.content_main,
                                        fragmentManager.findFragmentByTag("TAG0"), "TAG0");
                            } else{
                                fragmentManager.beginTransaction().replace(R.id.content_main, fragments[0], "TAG0").commit();
                            }
                            break;
                       default:
                           if(fragmentManager.findFragmentByTag("TAG1") != null){
                               Log.i("fm", "reloading stats frag");
                               fragmentManager.beginTransaction().replace(R.id.content_main,
                                       fragmentManager.findFragmentByTag("TAG1"), "TAG1");
                           } else{
                               fragmentManager.beginTransaction().replace(R.id.content_main, fragments[1], "TAG1").commit();
                           }
                           break;
                   }

                   drawerLayout.closeDrawers();
                   return true;
               }
           }
    );
}

编辑已解决:

我发现为了保存视图,它必须有一个ID(有意义)。另外,我之前的代码中没有使用.commit()和我的.replace部分

nav_view.setNavigationItemSelectedListener(
             new NavigationView.OnNavigationItemSelectedListener() {
                @Override
                public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                    item.setChecked(true);

                    FragmentManager fragmentManager = getSupportFragmentManager();
                    switch (item.getItemId()) {
                        case R.id.nav_routine:
                                fragmentManager.beginTransaction().replace(R.id.content_main, fragments[0], "TAG0").commit();
                            break;
                       default:
                               fragmentManager.beginTransaction().replace(R.id.content_main, fragments[1], "TAG1").commit();
                           break;
                   }

                   drawerLayout.closeDrawers();
                   return true;
               }
           }
    );

2 个答案:

答案 0 :(得分:0)

我不明白你的问题。但这就是如何保留片段的状态。

Fragment mfragment=new Fragmentname();           

        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.replace(R.id.fragment_container, mfragment);
        String backStateName = mfragment.getClass().getName();
        if (position != 0) {
            ft.addToBackStack(backStateName);
        }

        ft.commit();

答案 1 :(得分:0)

由于您可以在离开时保存Fragment的数据,我认为您已经了解SavedInstanceState。无论如何,当您使用片段事务从Activity处理一个片段到另一个片段时,您需要在提交之前添加addToBackStack(null)。因此交易应该看起来像

fragmentManager.beginTransaction().replace(R.id.content_main, fragments[0], "TAG0").addToBackStack(null).commit();

并覆盖onBackPressed这样的Activity功能。

@Override
public void onBackPressed() {
    if (getSupportFragmentManager().getBackStackEntryCount() > 0)
        getSupportFragmentManager().popBackStack();
    else
        super.onBackPressed();
}