我只有一个activity
和多个fragments
在我的应用程序。
两个主要片段A(左)和B(右)。
Fragment A1 called from A
B1 called from B
B2 called from B1
所有fragments
有个别后退按钮。
所以,当我按下背部的按钮fragment
A1,它应该回到A,同样,当返回从B2按钮被按下,B1出现,从B1到B等。
如何实现这种类型的功能?
我只有一个activity
和多个fragments
在我的应用程序。
两个主要片段A(左)和B(右)。
Fragment A1 called from A
B1 called from B
B2 called from B1
所有fragments
有个别后退按钮。
所以,当我按下背部的按钮fragment
A1,它应该回到A,同样,当返回从B2按钮被按下,B1出现,从B1到B等。
如何实现这种类型的功能?
public void onBackPressed()
{
FragmentManager fm = getActivity().getSupportFragmentManager();
fm.popBackStack();
}
我刚才已经实施了类似的情况。
活动“A” - >通话片段“A1”,然后点击菜单项,它调用片段“A2”,如果用户按下回从“A2”按钮,这又回到了“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:
我用新片段替换现有的片段时,菜单项的点击动作发生:
@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()方法:
由于所有的片段有一个父活动(这是“A”)时,onBackPressed()方法,可以弹出碎片如果有任何存在或只是回到以前的活动。
@Override
public void onBackPressed() {
if(getFragmentManager().getBackStackEntryCount() == 0) {
super.onBackPressed();
}
else {
getFragmentManager().popBackStack();
}
}
如果您正在寻找内部片段嵌入片段,请参考链接: http://developer.android.com/about/versions/android-4.2.html#NestedFragments
@ trueblue的回答让我用一个小的,但恼人的问题去。 当只有一个在堆栈中的片段,你按返回键,这架被删除,应用程序保持活跃,一个空白屏幕。 用户需要按后退按钮一次退出应用程序。 我修改了原来的代码如下,以处理这种情况
@Override
public void onBackPressed() {
if(getFragmentManager().getBackStackEntryCount() == 0) {
super.onBackPressed();
}
else if(getFragmentManager().getBackStackEntryCount() == 1) {
moveTaskToBack(false);
}
else {
getFragmentManager().popBackStack();
}
}
当只有1片段在堆栈中,我们基本上是告诉机器人移动的整个应用程序来备份。
所以做一些解决这个更多的阅读后,我发现,你可以添加片段经理的交易来支持栈 ,然后机器人自动和期望的方式处理回压。 下面的代码片段展示了如何做到这一点
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);
最后一行显示了如何添加一个事务回堆栈。 这解决了背压问题在除一个大多数情况下片段。 如果你继续按后退按钮,那么最终你会当只有一个在后面堆片段到达一个点。 在这一点上,你会想要做的两两件事之一
就我而言,那是后来的,所以我修改了覆盖onBackPressed
从我以前的答案看起来像下面的方法
@Override
public void onBackPressed() {
if(getFragmentManager().getBackStackEntryCount() == 1) {
moveTaskToBack(false);
}
else {
super.onBackPressed();
}
}
此代码是简单,因为它具有较少的逻辑,它比我们的自定义代码依赖于框架。 遗憾的是我没能实现代码,第一种情况下,我也没必要。
做就是了
getActivity().getFragmentManager().popBackStack();
你必须实现自己的堆栈中实现作为解释在这里。
您可以拨打popFragments()
当你在一个片段点击后退按钮,并调用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);
}
}
}
后退按钮的顺序,其中被碎片穿越加入到堆栈中 。 这是作为默认导航功能。 现在,如果你想要去的特定片段,您可以显示它从堆栈中。
您可以通过添加标签处理它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;
}
});
}
//编码愉快
如果按回的图像,你必须首先创建方法是这样
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();
}
});
它的工作对我罚款。