如何回到以前的片段手动按下单个片段的button?

我的应用程序中只有一个activity和多个fragments

两个主要片段A(左)和B(右)。

 Fragment A1 called from A B1 called from B B2 called from B1 

所有fragments都有单独的后退button。

所以当我按下fragment A1的button时,应该返回到A ,同样当按下从B2返回button时, B1出现,并且从B1B等等。

如何实现这种types的function?

Solutions Collecting From Web of "如何回到以前的片段手动按下单个片段的button?"

 public void onBackPressed() { FragmentManager fm = getActivity().getSupportFragmentManager(); fm.popBackStack(); } 

我刚刚实施了类似的情景。

活动“A” – >调用片段“A1”并点击菜单项,调用片段“A2”,如果用户从“A2”按下返回button,则返回到“A1”,并且如果用户按下之后从“A1”返回,结束活动“A”并返回。

请参阅以下代码:

活动'A' – OnCreate()方法:

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activityA); if (savedInstanceState == null) { Fragment fragInstance; //Calling the Fragment newInstance Static method fragInstance = FragmentA1.newInstance(); getFragmentManager().beginTransaction() .add(R.id.container, fragInstance) .commit(); } } 

片段:'A1'

当菜单项单击操作发生时,我用新的Fragmentreplace现有的片段:

 @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.action_edit_columns) { //Open the Fragment A2 and add this to backstack Fragment fragment = FragmentA2.newInstance(); this.getFragmentManager().beginTransaction() .replace(R.id.container, fragment) .addToBackStack(null) .commit(); return true; } return super.onOptionsItemSelected(item); } 

活动“A” – onBackPressed()方法:

由于所有片段都有一个父Activity(即“A”),因此onBackPressed()方法可以让您popup片段(如果有的话)或者只返回到前一个活动。

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

如果您正在寻找碎片内的embedded碎片,请参阅链接: http : //developer.android.com/about/versions/android-4.2.html#NestedFragments

@ trueblue的回答让我有一个小问题,但恼人的问题。 当只有一个片段在背后,你按回来button,该框架被删除,应用程序保持活动,一个空白的屏幕。 用户需要再按一次button退出应用程序。 为了处理这种情况,我将原始代码修改为以下代码

 @Override public void onBackPressed() { if(getFragmentManager().getBackStackEntryCount() == 0) { super.onBackPressed(); } else if(getFragmentManager().getBackStackEntryCount() == 1) { moveTaskToBack(false); } else { getFragmentManager().popBackStack(); } } 

当后台只有1个片段时,我们基本上是告诉android将整个应用程序移回。

更新(也许更好的答案)

所以在做了一些更多的阅读后,我发现你可以添加片段pipe理器事务回栈 ,然后android自动处理回来按所需的方式。 下面的代码片段显示了如何做到这一点

 Fragment fragment; //Create and instance of your fragment class here FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.replace(R.id.fragment_container, fragment).addToBackStack(null); fragmentTransaction.commit(); fragmentTransaction.addToBackStack(null); 

最后一行显示了如何将事务添加到回栈中。 这解决了在大多数情况下,除了一个以外的问题。 如果你继续按下button,那么当后堆栈中只有一个碎片时,你最终会到达一个点。 在这一点上,你会想做两件事情之一

  1. 从活动正在运行的任务的后退堆栈中移除包含碎片的活动。 这是因为你不想结束一个空白的活动
  2. 如果活动是任务的后退堆栈中的唯一活动,则在后台推送任务。

在我的情况,这是后来,所以我修改了覆盖onBackPressed方法从我以前的答案看起来像下面

 @Override public void onBackPressed() { if(getFragmentManager().getBackStackEntryCount() == 1) { moveTaskToBack(false); } else { super.onBackPressed(); } } 

这段代码比较简单,因为它的逻辑较less,它依赖于框架而不是我们自定义的代码。 不幸的是,我没有设法实现第一种情况的代码,因为我不需要。

做就是了

 getActivity().getFragmentManager().popBackStack(); 

你必须按照这里所说的来实现你自己的后台实现。

无论何时您单击片段中的后退button,都可以调用pushFragments()在您从一个片段导航到其他片段时调用pushFragments()

试试这个,它为我工作。

 public void onBackPressed() { if (mainLayout.isMenuShown()) { mainLayout.toggleMenu(); } else { FragmentManager fm = getSupportFragmentManager(); Log.print("back stack entry", fm.getBackStackEntryCount() + ""); if (fm.getBackStackEntryCount() > 1) { fm.popBackStack(); // super.onBackPressed(); // return; } else { if (doubleBackToExitPressedOnce) { fm.popBackStack(); super.onBackPressed(); return; } this.doubleBackToExitPressedOnce = true; Toast.makeText(this, "Press one more time to exit", Toast.LENGTH_SHORT).show(); new Handler().postDelayed(new Runnable() { @Override public void run() { doubleBackToExitPressedOnce = false; } }, 3000); } } } 

后退button将按照碎片添加到后台堆栈的顺序进行移动 。 这是默认提供的导航function。 现在,如果你想去特定的片段,你可以从后台显示它 。

您可以通过在backStack添加标签来处理它。 检查我的答案在这里:

https://stackoverflow.com/a/19477957/1572408

希望能帮助到你

 @Override public void onResume() { super.onResume(); getView().setFocusableInTouchMode(true); getView().requestFocus(); getView().setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){ // replace your fragment here return true; } return false; } }); } 

//快乐编码

如果按下图像,则必须先像这样创build方法

 private void Backpresses() { getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.contant_main, new Home()).commit(); } 

那么当你按下图像时,你必须这样打电话。

  back.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Backpresses(); } }); 

它对我来说工作得很好。