Ask*_* B. 203 android android-fragments back-stack
假设我有一个以编程方式添加了片段的活动:
private void animateToFragment(Fragment newFragment, String tag) {
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.fragment_container, newFragment, tag);
ft.addToBackStack(null);
ft.commit();
}
Run Code Online (Sandbox Code Playgroud)
返回到可见的上一个片段的最佳方法是什么?
我在Android按钮点击时发现了Trigger后退按钮功能,但我认为模拟后退键事件不是正确的方法(我也无法让它工作):
dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK));
Run Code Online (Sandbox Code Playgroud)
打电话finish()只关闭我不感兴趣的活动.
有没有更好的方法来解决这个问题?
stu*_*ess 339
看看getFragmentManager().popBackStack()方法(有几种可供选择)
http://developer.android.com/reference/android/app/FragmentManager.html#popBackStack()
Kyl*_*ner 124
要详细说明提供的其他答案,这是我的解决方案(放在一个活动中):
@Override
public void onBackPressed(){
FragmentManager fm = getFragmentManager();
if (fm.getBackStackEntryCount() > 0) {
Log.i("MainActivity", "popping backstack");
fm.popBackStack();
} else {
Log.i("MainActivity", "nothing on backstack, calling super");
super.onBackPressed();
}
}
Run Code Online (Sandbox Code Playgroud)
Jab*_*eer 26
当我们更新/添加片段时,
应包括.addToBackStack().
getSupportFragmentManager().beginTransaction()
.add(detailFragment, "detail") // Add this transaction to the back stack (name is an optional name for this back stack state, or null).
.addToBackStack(null)
.commit();
Run Code Online (Sandbox Code Playgroud)
之后,如果我们getFragments.popBackStackImmediate()添加/更新片段,并且返回当前屏幕,我们将返回true.
Yog*_*til 15
Android 导航架构组件。
以下代码对我有用:
findNavController().popBackStack()
Run Code Online (Sandbox Code Playgroud)
Bip*_*Das 11
如果我没有将 addToBackStack() 添加到我的片段事务中,这些答案不起作用,但是,您可以使用:
getActivity().onBackPressed();
Run Code Online (Sandbox Code Playgroud)
从你的任何片段往回走一步;
将这些行添加到onBackPressed()方法中.如果你在后台堆栈上有任何片段,popBackStackImmediate()方法会让你回到上一个片段
if(getFragmentManager().getBackStackEntryCount() > 0){
getFragmentManager().popBackStackImmediate();
}
else{
super.onBackPressed();
}
Run Code Online (Sandbox Code Playgroud)
`
当您想在主片段中回按时关闭应用程序时,此解决方案非常适合基于底部栏的片段导航。
另一方面,当您打开在我的代码中定义为“DetailedPizza”的次要片段(片段中的片段)时,它将返回主要片段的先前状态。干杯!
背面的内部活动按下了这个:
Fragment home = getSupportFragmentManager().findFragmentByTag("DetailedPizza");
if (home instanceof FragmentDetailedPizza && home.isVisible()) {
if (getFragmentManager().getBackStackEntryCount() != 0) {
getFragmentManager().popBackStack();
} else {
super.onBackPressed();
}
} else {
//Primary fragment
moveTaskToBack(true);
}
Run Code Online (Sandbox Code Playgroud)
并像这样启动另一个片段:
Fragment someFragment = new FragmentDetailedPizza();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.container_body, someFragment, "DetailedPizza");
transaction.addToBackStack("DetailedPizza");
transaction.commit();
Run Code Online (Sandbox Code Playgroud)
科特林答案
使用 Kotlin 在 Android Studio 4.0 中进行编码:
fragmentManager?.popBackStack()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
246053 次 |
| 最近记录: |