我有一个由2个片段组成的活动,我在我的活动中反对的内容是这样的。
private Boolean exit = false;
@Override
public void onBackPressed() {
if (exit) {
moveTaskToBack(true);
finish(); // finish activity
} else {
Toast.makeText(this, "Press Back again to Exit.",
Toast.LENGTH_SHORT).show();
exit = true;
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
exit = false;
}
}, 3 * 1000);
}
}
这导致直接关闭应用程序,即使我在片段2,实际应该发生的是它应该回到片段1没有关闭任何帮助......
答案 0 :(得分:2)
使用它:
@Override
public void onBackPressed() {
int fragmentCount = getSupportFragmentManager().getBackStackEntryCount();
if (fragmentCount == 1) {
finish();
} else {
if (fragmentCount > 1) {
getFragmentManager().popBackStack();
} else {
super.onBackPressed();
}
}
}
看看它是否有效。顺便说一句,它不是我的工作,但应该有效。
答案 1 :(得分:0)
首先检查您是否将片段添加到stack
。例如,如果您要从FirstFragment
导航到SecondFragment
,
FragmentManager manager = getSupportFragmentManager();
SecondFragment fragment = new SecondFragment();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.container, fragment).addToBackStack("tag");
transaction.commit();
然后在activity
覆盖onBackPressed
as,
@Override
public void onBackPressed() {
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
getSupportFragmentManager().popBackStackImmediate();
} else {
super.onBackPressed();
}
}
上面的方法从FirstFragment
导航到SecondFragment
,点击SecondFragment
上的后退按钮(如果片段堆栈为空,则从按下后退按钮上的活动返回)。
编辑: - 并始终尝试从活动中启动片段。永远不要碎片(这不是一个好习惯)。因为片段基本上是活动的一个实例,所以它需要从活动上下文开始,以更好地执行而不是片段上下文。
例如,如果您想从SecondFragment
开始FirstFragment
,那么在您的活动中创建一个方法,
public void startSecondFragment(){
FragmentManager manager = getSupportFragmentManager();
SecondFragment fragment = new SecondFragment();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.container, fragment).addToBackStack("tag");
transaction.commit();
}
然后在FirstFragment
当你想要开始SecondFragment
时,你就可以开始了,
((YourActivity) getActivity()).startSecondFragment();
答案 2 :(得分:0)
只需在片段交易中使用 addToBackStack(null)。
fragmentManager.beginTransaction()
.replace(R.id.content_frame, list)
.addToBackStack(null)
.commit();
关于活动onBackPressed()
@Override
public void onBackPressed() {
if (getFragmentManager().getBackStackEntryCount() > 0 ){
getFragmentManager().popBackStackImmediate();
} else {
super.onBackPressed();
}
}
希望这会对你有所帮助。