【问题标题】:Navigation view fragments and child backstack导航视图片段和子后台堆栈
【发布时间】:2017-09-30 08:23:02
【问题描述】:

我之前处理过片段,但那是使用视图寻呼机和 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;
               }
           }
    );

【问题讨论】:

  • 使用 onSaveInstanceState 保存/重用您的edittext数据..

标签: android android-fragments back-stack


【解决方案1】:

我不清楚你的问题。但这就是如何保持片段的 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();

【讨论】:

    【解决方案2】:

    因为您可以在离开时保存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();
    }
    

    【讨论】:

    • 我的意思是,在菜单片段之间来回导航时,我需要保留我所做的任何更改。我知道对于子片段(深片段),我可以使用 getChildFragmentManager,因此每个主片段都可以有自己的后栈。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    相关资源
    最近更新 更多