跳过一些片段onBackPressed

我相当新的android碎片,所以请忍受我。

我有一堆使用单个活动作为主机的片段。

在我看来,我的片段按章节分组,尽pipe它们仍然是模块化的/可以通过代码重用。 考虑这个想要的场景:

Frag1 – >(按Next) – > Frag2 – >(按Next) – > Frag3 – >(按返回) – > Frag1

在经历了一系列片段之后,我想跳过一些以前的片段(在这种情况下,跳过Frag 2)按下后退button。

然而,在我目前的代码中,我的问题是,即使它回到Frag1,Frag3也不会从屏幕上消失。 会发生什么是Frag1和Frag3变得可见彼此之上。

以下是我的相关代码片段:

用于创buildFrag1的代码片段

@Override public void onNavigationDrawerItemSelected(int position) { // update the main content by replacing fragments // init the fragment (with a default fragment, not null) Fragment fragment = PlaceholderFragment.newInstance(position + 1); // Position number from navigation sidebar starts from 0. // Since position starts from 0, add 1 to match section number // as implemented in {@link #onSectionAttached()} switch(position) { case 0: fragment = PlaceholderFragment.newInstance(position + 1); break; case 1: // Frag1 case fragment = new AddPointsFragment().newInstance(position + 1, ""); break; default: break; } // update the main content by replacing fragments FragmentManager fragmentManager = getFragmentManager(); // clear all fragments from previous section from the back stack fragmentManager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); // replace all currently added fragments in container and replace with the new fragment fragmentManager.beginTransaction() .replace(R.id.container, fragment) .commit(); } 

用于创buildFrag2的代码片段

 public void onEnterButtonFragmentInteraction(int sectionNumber, String cardNo) { // TODO: Add point for given card number int points = 5; //sample points AddPointsSuccessFragment addPointsSuccessFragment = new AddPointsSuccessFragment().newInstance(sectionNumber, cardNo, points); FragmentManager fragmentManager = getFragmentManager(); fragmentManager.beginTransaction() .replace(R.id.container, addPointsSuccessFragment) .addToBackStack(null) .commit(); } 

用于创buildFrag3的代码片段

 public void onOkButtonFragmentInteraction(int sectionNumber, String cardNo, int points) { RedeemRewardFragment redeemRewardFragment = new RedeemRewardFragment().newInstance(sectionNumber, cardNo, points); FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); fragmentTransaction.replace(R.id.container, redeemRewardFragment); fragmentTransaction.commit(); } 

我目前的解决方法是通过添加.addToBackStack(null)创buildFrag3并运行此代码

 public void onBackButtonFragmentInteraction() { this.onBackPressed(); // simulate pressing of activity back button FragmentManager fragmentmanager = getFragmentManager(); fragmentmanager.popBackStack(); // pop Frag2 from back stack } 

在调用onBackPressed()方法之后。 不幸的是,这个解决方法是丑陋的,因为在去Frag1之前有一个Frag2的分秒的外观。

Solutions Collecting From Web of "跳过一些片段onBackPressed"

所以你的解决scheme的关键是这个人:

 .addToBackStack(null) 

您可以传递特定事务的string标识符(而不是null),例如,Fragment的类名称就是我们所使用的(尽pipe如果您在backstack中有相同片段的多个实例,那么这不起作用) :

 .addToBackStack(Fragment1.class.getName()) 

然后,如果你想从Fragment3返回Fragment3 ,只需使用下一个片段的标识符来popup,并传递INCLUSIVE标志(这意味着它也会popup你指定的下一个片段):

 getFragmentManager().popBackStack( Fragment2.class.getName(), FragmentManager.POP_BACK_STACK_INCLUSIVE); 

哪个会按照预期播放你的animation,但好像它们之间的片段从来没有。 我build议使用下一个片段的原因是因为你可能不希望你的第一个片段事务在后面的栈上。

你可以尝试这个,它应该工作,并没有给出一秒钟的延迟。 它不是漂亮的代码,如果有人有更好的办法,请发表。

给你的片段添加一个标签。

 transaction.add(R.id.main_activity_container, FirstFragment, "FirstFragment"); transaction.replace(R.id.main_activity_container, Second, "SECOND"); transaction.replace(R.id.main_activity_container, Third, "THIRD"); 

修改你的frameActivity(activity)中的onBackPressed(),以“容纳”你的片段。

 @Override public void onBackPressed() { // TODO Auto-generated method stub int lastStack = getSupportFragmentManager().getBackStackEntryCount(); try { //If the last fragment was named/tagged "three" if (getSupportFragmentManager().getFragments().get(lastStack).getTag().equalsIgnoreCase("THIRD")){ getSupportFragmentManager().popBackStackImmediate(); getSupportFragmentManager().popBackStackImmediate(); //Get your first fragment that you loaded in the beginning. Fragment first = getSupportFragmentManager().findFragmentByTag("FirstFragment"); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.replace(R.id.main_activity_container, first); transaction.commit(); return; } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } super.onBackPressed(); } 

当你显示Frag2时使用:

 final FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); fragmentTransaction.addToBackStack(FRAG_2); fragmentTransaction.replace(containerID, frag2, FRAG2_TAG); 

并在后面按:

 @Override public void onBackPressed() { final Frag2 frag2 = (Frag2)getSupportFragmentManager().findFragmentByTag(FRAG2_TAG); if (frag2 != null && frag2.isVisible() && getSupportFragmentManager().getBackStackEntryCount() > 0) { getSupportFragmentManager().popBackStackImmediate(); return; } } 

这将防止在调用onBackPressed()之后显示frag2。 避免使用popBackStack(),因为这将导致frag2生命周期触发器(onCreate,onStart,onResume …)