当前位置: 首页 > 知识库问答 >
问题:

使用导航组件从Backback中解开碎片

权兴为
2023-03-14

我有X、A、B片段,我使用导航架构组件在它们之间导航。

片段A、B特异性,但片段X可以是任何(C、D、...);

底部导航中的片段A和B及其“导航图标”始终在屏幕上,这意味着用户可以随时从任何片段(包括A和B)转到A或B:

<代码>X-

<代码>X-

<代码>A-

<代码>A-

//另一种方式

我的问题是:

<代码>X-

如果用户从X开始,到达并开始通过“返回”按钮返回,他会多次抛出AB

用户后退:

<代码>-

但我想从Backback中“排除”已经存在的片段:

<代码>-

如果用户导航:

<代码>X-

我想看看:

<代码>A-

不是:

<代码>A-

我正在尝试用Pop To来做这件事,但它只能在一个具体的片段上返回我。我需要返回我开始的X片段,而不是硬编码。包容性和单顶与此无关。

我不确定我能用基本的导航组件做到这一点,所以我需要你的建议。如果我做不到,我应该用什么方法?有什么好的做法吗?

UPD:

我正在使用全局点在片段之间导航。这就是我的导航方式:

右|底链是X,我可以使用底部导航从其中任何一个导航到未更改的片段。这是一款单活动应用程序,我正在使用它导航:

   //Using global points
   findNavController(R.id.host).navigate(R.id.toLibrary)

共有2个答案

咸弘雅
2023-03-14

在fragmentTransaction中,而不是使用addToBackStack()或add(…)使用fragmentTransaction。替换(int containerViewId,Fragment Fragment,String tag)

余弘毅
2023-03-14
匿名用户

以下解决方案采用片段可见性技术,以便在onBackPressed()时管理片段。

我们在调用每个片段时为它分配一个标签

 fragmentManager.beginTransaction()
.replace(R.id.FragmentHolder, Fragment_A OR Fragment_B OR Fragment_ANY, "A or B or ANY")
.addToBackStack(tag).commit();

请记住,您必须为要处理的任何片段分配一个标记。

我们将处理public void onBackPressed()

你必须忽略超级。onBackPressed()因为,我们不想在按下后退按钮时取消onBackPressed方法影响backbackback(按原样)。此外,我们希望自己处理回撤。

干得好

@Override
public void onBackPressed() {
    if(isVisible("A")) { //Go some where else you wanna go }
    else if(isVisible("B")){ //Go some where else you wanna go }
    else if(isVisible("X or any"){ //Go some where else you wanna go }
    else { //Go default page }
}


public boolean isVisible(String tag){
    try {
        Fragment fragment = fragmentManager.findFragmentByTag(tag);
        if (fragment != null && fragment.isVisible())
            return true;
        else
            return false;
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
 }

当按下后退按钮时,我们检查哪个片段已经可见,并将用户重定向到相应的前置片段。

对于Ex:A-

我使用这个技术发布了一个应用程序,一切都很好。

 类似资料:
  • java.lang.runtimeException:无法启动活动ComponentInfo{com.farmbuy/com.farmbuy.farmer.farmersactivity}:Android.view.farmersactivity:二进制XML文件行#49:二进制XML文件行#49:在Android.app.activitythread.performLaunchActivity(

  • 我是Android Jetpack导航架构的新手。我正在一个新应用程序上试用它。有一个活动和一些片段,其中两个是登录屏幕和电子邮件登录屏幕。我在我的导航XML中定义了这些片段。应用程序的流程如下: 登录屏幕→ <代码>电子邮件登录屏幕 我想要的是,在导航到电子邮件登录屏幕后,当我向后按时,应用程序退出。这意味着登录屏幕的后堆栈被删除了。我知道登录屏幕不应该这样工作,但我仍然只是在解决问题。 我遵循

  • 我的问题是,当我点击操作栏项时,onOptionsItemSelected被调用,但不起作用。 我只希望后退按钮能工作。这是我的代码,这是在SherlockFragment文件中: 在onbackpressed中,当我们处于两个窗格模式时,或者当我们处于第一个片断(所以第二个片断为空),就绪为true。 如果我按下后退键,一切正常,碎片就会被替换掉。但当我点击action bar中的back按钮时

  • 我正在尝试在我现有的应用程序中使用Jetpack的架构组件实现导航。 我有一个单一的活动应用程序,其中主要片段(。因此,当按下back时,将分离细节片段,并再次显示ListFragment。 对于导航架构,这是自动处理的。不是添加它被替换的新片段,因此片段视图被销毁,而是在按下back以重新创建视图时调用和。 我知道这是一个很好的模式,用于LiveData和ViewModel,以避免使用超过必要的