繁体   English   中英

导航视图片段和子堆栈

[英]Navigation view fragments and child backstack

我之前已经处理过片段,但是那是使用视图分页器和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;
               }
           }
    );

我不清楚您的问题。但这是如何保留片段的backState。

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

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

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

并像这样覆盖您的ActivityonBackPressed函数。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM