繁体   English   中英

在android中浏览Fragments而不将其添加到backstack

[英]Navigating through Fragments in android without adding it into backstack

我正在使用android应用程序。 我正面临像在后台堆栈历史记录中添加片段的问题。 让我清楚地解释一下,我想从片段A导航到片段B,然后使用按钮单击片段B中的片段回到片段A。以上方案运行良好,在我单击设备中的向后箭头后导航到片段A后,导航到片段B。我不希望发生这种情况。 给我一个解决方案。 我的代码结构如下:

片段A:

.......
FragmentB fragmentB = new FragmentB();
showFragmentOmitStack(fragmentB);
....


public void showFragmentOmitStack(Fragment fragment) {
 FragmentTransaction transaction = getFragmentManager().beginTransaction();
 transaction.add(R.id.container,fragment);//add // replace
 transaction.addToBackStack(null);
 transaction.commit();
}

片段B:

FragmentA fragmentA = new FragmentA();
showFragment(fragmentA, "FragmentA");


public void showFragment(Fragment fragment, String back_stack_name) {
 FragmentManager fragmentManager = thisActivity.getFragmentManager();
 FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
 fragmentTransaction.add(R.id.container, fragment);
 fragmentTransaction.addToBackStack(back_stack_name);
 fragmentTransaction.commit();
}

在“我的活动” java文件中:

@Override
public void onBackPressed() {
 DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
 if (drawer.isDrawerOpen(GravityCompat.START)) {
     drawer.closeDrawer(GravityCompat.START);
   } else {
    if (getFragmentManager().getBackStackEntryCount() == 0) {
      showAlertDialog(Constants.EXIT_APP, Constants.APP_NAME);
     } else {
        getFragmentManager().popBackStackImmediate();
            }
        }
    }

尝试这个:

@Override
public void onBackPressed() {
    if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
        getSupportFragmentManager().popBackStack();
    }else {
       if (drawerLayout.isDrawerOpen(GravityCompat.START)) {
           drawerLayout.closeDrawer(GravityCompat.START);
         } else {
            super.onBackPressed();
        }  
    }
}

如果您不希望通过后退键返回到上一个片段,则在添加片段时不要将片段添加到backStack中,即删除该片段:

fragmentTransaction.addToBackStack(myFragmentName);

每个片段都有它自己的事务,因此当您使用addToBackStack添加A时,多数民众赞成在片段A上! 在片段B事务中,将其设置为null,就是说B不会支持。 因此,后向堆栈中唯一会受到反向按压影响的片段是A!

在片段B上设置的按钮单击事件上,将您从那里移回片段A,只需删除

yourTransaction.addToBackStack(NULL);

并且您将很好走。

如果仅使用两个片段A和B,则可以执行以下操作:

在您的活动中

@Override
public void onBackPressed() {
  if (drawer.isDrawerOpen(GravityCompat.START)) {
    drawer.closeDrawer(GravityCompat.START);
  } 
  else if (currentFragment instanceOf FragmentB) {
    Fragment fragmentA = new FragmentA();
    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = 
    fragmentManager.beginTransaction();
    fragmentTransaction.replace(R.id.container, fragmentA);
    fragmentTransaction.commit();
    currentFragment = fragmentA;
  }  
  else {
       super.onBackPressed();
      }
  }
}

无需添加到后台堆栈中,只需在类中创建一个实例变量即可: Fragment currentFragment = null; 然后只需将currentFragment设置为您启动的片段即可。

addToBackStack(null)仍将片段B添加到后堆栈中。 null参数只是后退堆栈状态的名称。 如果您不希望将片段添加到后台堆栈,则应在showFragmentOmitStack方法中删除该行。

来源: https : //developer.android.com/reference/android/app/FragmentTransaction#addToBackStack(java.lang.String)

暂无
暂无

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

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