【问题标题】:Android - Back button and fragment backstack not workingAndroid - 后退按钮和片段后台堆栈不起作用
【发布时间】:2012-09-26 20:42:18
【问题描述】:

我正在开发一个带有单个 FragmentActivity 的简单的基于片段的应用程序。应用程序的每个“屏幕”都包含在一个片段中,所有片段都在应用程序启动时添加到容器布局中。

// Set up fragments in Main Activity
fragMan = getFragmentManager();
FragmentTransaction ft = fragMan.beginTransaction();
ft.add(R.id.fragment_container, settingsFragment);
ft.add(R.id.fragment_container, mapFragment);
ft.add(R.id.fragment_container, tracksFragment);
ft.add(R.id.fragment_container, waypointsFragment);
ft.commit();

过渡是通过隐藏当前可见的片段,然后显示适当的片段来完成的。

ft = fragMan.beginTransaction();
ft.show(mapFragment);
ft.addToBackStack(null);
ft.commit();

这一切都很好,但是当按下后退按钮时,应用程序退出,无论哪个屏幕可见或之前的哪些事务已添加到后退堆栈。

我已检查以确保返回堆栈正确累积记录并尝试了许多不同的转换方法变体,例如替换片段而不是隐藏/显示它们,创建片段的新实例而不是将它们存储在变量中等. 据我所知,我的代码与我能找到的所有教程和示例相匹配,我什至找不到任何类似的问题/类似问题的示例,大概是因为标准实现对其他人“有效” .

我怀疑这可能是应用程序级别的问题,例如我的清单中的一个属性(我已经进行了相当彻底的调查)或我的应用程序设置方式固有的问题,它阻止了后退按钮正常工作。我可以重写 onBackPressed 来手动处理转换,但这似乎是一个非常难看的解决方法。关于为什么这可能没有按预期运行的任何想法?顺便说一下,这是在运行 Jelly Bean 的 Nexus 7 上。

【问题讨论】:

    标签: android android-fragments fragment-backstack


    【解决方案1】:

    检查您是否使用 FragmentActivity(来自支持库)而不是 Activity。这会导致backstack和transition问题。

    【讨论】:

      【解决方案2】:

      我不确定这是否会解决您的问题,但我认为您不需要添加所有片段。

      我还注意到(至少在兼容性库中)replace 方法似乎有很多错误,所以最好先删除现有片段,然后添加新片段。

      这是我用来更改片段的代码:

      /**
       * Changes the detail fragment of this activity. This is how all content is presented in this app.
       * @param fragment
       * @param animated
       * @param addCurrentFragmentToBackStack
       */
      private void changeDetailFragment(Fragment fragment,boolean animated,boolean addCurrentFragmentToBackStack)
      {
          FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
      
              if (animated)
                  transaction.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out);
      
          Fragment currentFrag =  getSupportFragmentManager().findFragmentById(R.id.detailFragment);
      
      
          String fragName = "NONE";
      
          if (currentFrag!=null)
              fragName = currentFrag.getClass().getSimpleName();
      
      
          if (currentFrag != null)
          {
      
              transaction.remove(currentFrag);
          }
      
      
          transaction.add(R.id.detailFragment,fragment);
      
      
          if (addCurrentFragmentToBackStack)
          {
              Log.i("APP_NAME","Adding: " + fragName + " to the backstack");
              transaction.addToBackStack(null);
          }
          else
          {
              Log.i("APP_NAME","Not adding: " + fragName + " to the backstack");
          }
      
      
      
          transaction.commit();
      
      }
      

      希望这会有所帮助。

      【讨论】:

        【解决方案3】:

        对我来说,将 appcompat 的版本更改为 27.1.1(截至 2018 年 8 月 15 日)有效。原来 appcompat 版本 v7:28.0.0-rc01 是罪魁祸首。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多