关键词:
【中文标题】Android:返回到上一个片段后按【英文标题】:Android : Return to previous fragment on back press 【发布时间】:2014-10-10 14:30:33 【问题描述】:我已经实现了导航抽屉,它是 Activity 的子类。我的应用程序中有很多片段。我的问题在这里
假设有 3 个片段:
Fragment_1:Fragment_2:Fragment_3
当我启动我的应用程序时,会加载 Fragment_1 当我单击 Fragment_1 上的某些组件时,我会导航到 Fragment_2 等等..
原来如此
Fragment_1 > Fragment_2 > Fragment_3
当我从 Fragment_2 按返回键时,我被导航回 Fragment_1 但是当我从 Fragment_3 按下返回键时,我会导航回 Fragment_1(而不是 Fragment_2)
我希望在我的应用程序中按后退键
Fragment_1
我使用了 Fragment、FragmentManager、FragmentTransaction 如下:
MyFragment fragment = new MyFragment();
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).addToBackStack(null)commit();
我尝试在 MainActivity 中覆盖 onBackPressed() :
@Override
public void onBackPressed()
getFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
int count = getFragmentManager().getBackStackEntryCount();
if (count == 0)
super.onBackPressed();
【问题讨论】:
【参考方案1】:将您的 Activity#onBackPressed()
方法更新为:
@Override
public void onBackPressed()
if (getFragmentManager().getBackStackEntryCount() > 0)
getFragmentManager().popBackStack();
else
super.onBackPressed();
您的实现不起作用的原因是因为方法 FragmentManager#popBackStack()
是异步的,并且不会在调用后立即发生。
来自文档:
此函数是异步的——它将请求排入队列以弹出,但在应用程序返回其事件循环之前不会执行该操作。
参考:http://developer.android.com/reference/android/app/FragmentManager.html#popBackStack(java.lang.String,%20int)
【讨论】:
您的代码在某些方面有效。问题是 :: 假设我导航如下 >> Fragment_1 > Fragment_2 > Fragment_3 ,然后从导航抽屉中我再次选择 Fragment_1 并导航如下,然后按返回键,我发现以下序列 Fragment_1 您正在获取此序列,因为您正在执行的每个FragmentManager
操作都通过FragmentTransaction#addToBackStack()
添加到后台堆栈。我再次阅读了您的问题,但仍然不知道您在这种情况下的期望是什么。请澄清。
实际上你的代码解决了我的问题。但是如何更改以下顺序 :: Fragment_1 to Fragment_1 Fragment_2 > Fragment_3。如果您仍然不明白我的意思,那么我的问题的另一个术语是删除相同片段的冗余
我猜你打算做的是避免FragmentManager
和 Back 堆栈中的重复条目,对吧?如果是这样,您可以检查Fragment
是否已经在堆栈中,方法是在您提交它时设置一个TAG,然后他们搜索它(使用FragmentManager#findFragmentByTag(String TAG)
,如果它不返回空值,则不调用addToBackStack()
。如果它解决了您的问题,也请将我的回复标记为问题的答案。
你能用简短的例子说明一下吗? (findFragmentByTag(...) 的代码)【参考方案2】:
您必须按照此处的说明实现自己的 backstack 实现
Separate Back Stack for each tab in Android using Fragments
您可以在单击片段中的后退按钮时调用 popFragments(),并在从一个片段导航到另一个片段时调用 pushFragments()。
简而言之,
public void onBackPressed()
FragmentManager fm = getActivity().getSupportFragmentManager();
fm.popBackStack();
【讨论】:
【参考方案3】:tric 位于FragmentManager#executePendingTransactions();
。
这也是我用于嵌套片段的...:
/**
* if there is a fragment and the back stack of this fragment is not empty,
* then emulate 'onBackPressed' behaviour, because in default, it is not working.
*
* @param fm the fragment manager to which we will try to dispatch the back pressed event.
* @return @code true if the onBackPressed event was consumed by a child fragment, otherwise
*/
public static boolean dispatchOnBackPressedToFragments(FragmentManager fm)
List<Fragment> fragments = fm.getFragments();
boolean result;
if (fragments != null && !fragments.isEmpty())
for (Fragment frag : fragments)
if (frag != null && frag.isAdded() && frag.getChildFragmentManager() != null)
// go to the next level of child fragments.
result = dispatchOnBackPressedToFragments(frag.getChildFragmentManager());
if (result) return true;
// if the back stack is not empty then we pop the last transaction.
if (fm.getBackStackEntryCount() > 0)
fm.popBackStack();
fm.executePendingTransactions();
return true;
return false;
在我的onBackPressed
中:
if (!FragmentUtils.dispatchOnBackPressedToFragments(fm))
// if no child fragment consumed the onBackPressed event,
// we execute the default behaviour.
super.onBackPressed();
【讨论】:
非常有用的答案。【参考方案4】:在您的主要活动中使用此代码更改选项卡以清除堆栈。
int count = getFragmentManager().getBackStackEntryCount();
if(count>0)
for (int i = 0; i <count; i++)
getFragmentManager().popBackStack();
然后在你的主要活动的后退执行此操作
int count = getFragmentManager().getBackStackEntryCount();
if (count == 0)
super.onbackpressed();
else
getFragmentManager().popBackStack();
【讨论】:
【参考方案5】:这是我的工作和测试代码,这将对您有所帮助
private static final int TIME_INTERVAL = 2000;
private long mBackPressed;
private void applyExit()
if (mBackPressed + TIME_INTERVAL > System.currentTimeMillis())
finish();
else
Toast.makeText(this,"Press Again to exit",Toast.LENGTH_LONG).show();
mBackPressed = System.currentTimeMillis();
@Override
public void onBackPressed()
fm = getSupportFragmentManager();
if (drawer.isDrawerOpen(GravityCompat.START))
drawer.closeDrawer(GravityCompat.START);
if (fm.getFragments().size() <= 1)
applyExit();
else
for (Fragment frag : fm.getFragments())
if (frag == null)
applyExit();
return;
if (frag.isVisible())
FragmentManager childFm = frag.getChildFragmentManager();
if (childFm.getFragments() == null)
super.onBackPressed();
return;
if (childFm.getBackStackEntryCount() > 0)
childFm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
return;
else
fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
return;
【讨论】:
从片段返回到上一个活动 onclick back button
】从片段返回到上一个活动onclickbackbutton【英文标题】:gobackfromfragmenttopreviousactivityonclickbackbutton【发布时间】:2015-05-2505:35:02【问题描述】:如何从片段返回到上一个活动?我不能在片段中覆盖这个函数或者有其他方法,帮助... 查看详情
按一次返回按钮停留在同一个片段上,如果按两次,它将返回到上一个片段
】按一次返回按钮停留在同一个片段上,如果按两次,它将返回到上一个片段【英文标题】:Pressingbackbuttononcestayonthesamefragment,andifpressingtwice,itwillgobacktopreviousfragment【发布时间】:2021-06-1708:37:53【问题描述】:我有以下代码packag... 查看详情
在 Android 中使用片段时处理后按
】在Android中使用片段时处理后按【英文标题】:HandlingbackpresswhenusingfragmentsinAndroid【发布时间】:2014-04-2811:28:14【问题描述】:我在我的应用程序中使用带有导航抽屉的Android滑动菜单,并且在应用程序中使用片段而不是活动。... 查看详情
androidtransactionfragment时按返回键直接退出,没有返回到上一个fragment
问题分析:最近做Android开发用到了一个Fragment切换到查看照片的Fragment,查看完照片按返回键没有按常规流程回到上一个碎片,而是直接退出APP了。解决方案:删除父fragment下的包android.app.Fragment(如果包含了... 查看详情
Android Studio片段没有响应后按按钮
】AndroidStudio片段没有响应后按按钮【英文标题】:Androidstudiofragmentnotrespondingtobackpressedbutton【发布时间】:2020-04-1212:21:11【问题描述】:我的应用中只有一个活动和很多片段一切正常,我将此代码添加到我的loginFragment@Overridepubli... 查看详情
后退按钮关闭应用程序而不是转到上一个片段 android 导航组件
】后退按钮关闭应用程序而不是转到上一个片段android导航组件【英文标题】:Backbuttonclosesappinsteadofgoingtopreviousfragmentandroidnavigationcomponent【发布时间】:2020-03-2311:52:45【问题描述】:在创建一个非常简单的示例应用程序时,我无... 查看详情
android NavController 不处理带有动画的快速后按
】androidNavController不处理带有动画的快速后按【英文标题】:androidNavControllerdoesnothandlefastbackpresswithanimation【发布时间】:2021-03-1901:47:04【问题描述】:使用导航组件使用片段过渡动画时,在动画完成之前不会调用退出片段(A)onDes... 查看详情
如何使用活动显示的片段转到上一个活动
...ragments,其中一个启动活动B。当我按下操作栏按钮时,它返回到活动A,但显示默认的Fragment。我正在使用navUtils.navigate 查看详情
Android / Xamarin,按返回按钮后按意图打开文件并关闭应用程序
】Android/Xamarin,按返回按钮后按意图打开文件并关闭应用程序【英文标题】:Android/Xamarin,Openfilewithintentandcloseappafterbackbuttonpressed【发布时间】:2021-11-1421:39:45【问题描述】:我的应用程序功能有问题。我需要打开外部文件以显... 查看详情
带有 Webview 的片段利用硬件后退按钮转到上一个网页
...!)。我一直在尝试允许MainActivity中的片段使用硬件按钮返回片段中web视图中的上一页。 查看详情
返回按钮到上一个局部视图
】返回按钮到上一个局部视图【英文标题】:Backbuttontopreviouspartialview【发布时间】:2015-01-1515:47:58【问题描述】:在我的.NetMVC4项目中,视图包含部分视图,在每个对应的Ajax.Beginform和选项InsertionMode=InsertionMode.Replace,之后替换为... 查看详情
Native Android App中的颤振,后按不起作用
】NativeAndroidApp中的颤振,后按不起作用【英文标题】:FlutterinNativeAndroidApp,backpressednotworking【发布时间】:2020-12-0713:57:54【问题描述】:我阅读了很多关于此的主题,但没有任何效果,并且与我的上下文完全相同。我正在尝试在... 查看详情
UINavigationItem 后退按钮返回到上一个导航项,但视图没有改变
】UINavigationItem后退按钮返回到上一个导航项,但视图没有改变【英文标题】:UINavigationItembackbuttonreturnstopreviousnavigationitem,butviewdoesn\'tchange【发布时间】:2009-10-0323:23:47【问题描述】:我有一个添加导航栏并显示新视图的“didSele... 查看详情
返回 App SpriteKit 后按播放
】返回AppSpriteKit后按播放【英文标题】:PressingplayafterreturningtoAppSpriteKit【发布时间】:2016-04-1521:55:18【问题描述】:APPDELEGATE崩溃问题我是编程的初学者,在开发我的应用程序时,出现了一个无法解决的问题。当用户离开应用程... 查看详情
在命令提示符界面如何返回到上一个文件夹?
在DOS界面当我打开A文件夹中的B文件夹后,如何返回到上一层去打开A文件夹中的C文件夹?谢谢!参考技术A返回到上一级文件夹用:CD返回到根文件夹用:CD\本回答被提问者采纳 参考技术Bcd.. 参考技术Ccd这个命令可以,具体使... 查看详情
使用导航从一个片段导航到另一个片段后,防止后按工作
】使用导航从一个片段导航到另一个片段后,防止后按工作【英文标题】:preventonbackpressedtoworkafterusingnavigationtonavigatefromonefragmenttotheother【发布时间】:2020-09-0319:14:00【问题描述】:您好,我使用导航组件和导航图从一个片段导... 查看详情
如何避免返回到带有 HTML id 属性标记的上一个部分,而是转到上一个网站?
】如何避免返回到带有HTMLid属性标记的上一个部分,而是转到上一个网站?【英文标题】:HowtoavoidgoingbacktoaprevioussectiontaggedwithanHTMLidattributeandgotoapreviouswebsiteinstead?【发布时间】:2019-09-1813:26:30【问题描述】:我有一个包含多个... 查看详情
在片段的后按防止使用导航图调用前一个片段的 onViewCreated
】在片段的后按防止使用导航图调用前一个片段的onViewCreated【英文标题】:OnbackpressoffragmentpreventtocallonViewCreatedofpreviousfragmentusingnavigationgraph【发布时间】:2019-06-1419:38:12【问题描述】:我正在使用喷气背包导航在片段之间导航... 查看详情