Android:返回到上一个片段后按

     2023-04-15     201

关键词:

【中文标题】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【问题描述】:我正在使用喷气背包导航在片段之间导航... 查看详情