【问题标题】:Switching between different fragments in Android在 Android 中不同的 Fragment 之间切换
【发布时间】:2016-03-16 10:19:36
【问题描述】:

我是android开发的新手,请多多包涵。 我有三个片段——Frag1、Frag2 和 Frag3。 Frag1 是一种 ListView,具有在启动应用程序时创建的项目列表。 Frag2 和 Frag3 基本上对应 VideoViews,它们将用于播放来自不同播放器的不同视频。其中一个将播放内容视频,另一个将播放广告视频。

当我单击 Frag1 中的特定项目时,我想同时创建 Frag2 和 Frag3。我想同时拥有这两个片段,因为我可能必须随时播放广告。我会在播放广告时隐藏内容片段,反之亦然。 我还希望当按下后退按钮时,我应该返回 Frag1(listView),无论按下后退按钮时 Frag2 还是 Frag3 是否可见。

我无法清楚地弄清楚如何堆叠片段,以便每当我在播放广告或视频时按下返回按钮时,它都会转到 listView。因为如果我理解正确,片段会按照添加的顺序堆积起来。因此,如果我按 Frag1 后跟 Frag2 和 Frag3 的顺序添加,那么当 Frag3 在顶部时按回将转到 Frag2 而不是 Frag1。还说如果当前 Frag2 是可见的并且我按下返回,那么我认为 Frag3 仍然会保留,即使我希望 Frag2 和 Frag3 在我按下返回按钮时都会弹出。

请帮助我解决这个问题。任何正确解释此处使用的概念的链接也将受到赞赏。

【问题讨论】:

  • 您可以使用 FragmentManager.popBackStack(String name, FragmentManager.POP_BACK_STACK_INCLUSIVE) 将所有片段从 backstack 弹出到指定的片段。
  • 如果您没有同时使用 frag2 和 frag3,那么您可以在同一视图上显示添加视频和内容视频。

标签: android android-fragments


【解决方案1】:

为此,您可以使用具有以下功能的标签片段。 试试这个-

public void onBackPressed(){
   FragmentManager fm = getActivity().getSupportFragmentManager();
   fm.popBackStack();
}

【讨论】:

    【解决方案2】:

    只有在执行 Fragment Transaction 时调用 addToBackStack(),才会将 Fragment 添加到 back stack。

    方法一

    因此,当您从 Frag1 打开 Frag2 时,您应该调用它,因为您希望您的 Frag1 在您按下返回时在那里。

    而当您从 Frag2 打开 Frag3 或反之亦然时,请不要调用 addToBackStack()。如果然后您按下 Frag3 或 Frag2 的后退按钮,您将直接转到 Frag1,因为您的后退堆栈将只有 Frag1。

    方法二

    另一种方法是在 Activity 中覆盖您的 onBackPressed() 方法。每当按下后退按钮时,您都可以使用

    弹出后退堆栈
    Fragment f = getFragmentManager.popBackStackImmediate
    

    然后检查哪个 Fragment 是通过 -

    if(f instanceof Frag2 || f instanceof Frag3){
        //pop it
    }
    

    现在再次检查。继续检查直到只剩下 Frag1。

    【讨论】:

      【解决方案3】:

      您需要通过为其提供 id 来管理片段,您可以在 backpress() 上替换删除您想要的任何内容,只需查看我开发要管理的代码,我也有类似的要求,所以这就是我的方式托管

          @Override
              public void onBackPressed() {
      
            Highlights_fragment test1 = (Highlights_fragment)getFragmentManager().findFragmentByTag("1");
            Aktulless_Fragment test2 = (Aktulless_Fragment)getFragmentManager().findFragmentByTag("2");
      
              if (test1 != null && test1.isVisible()) {
                  //DO STUFF
                  getFragmentManager().beginTransaction().remove(getFragmentManager().findFragmentById(R.id.frame_container)).commit();
      
              }
               else if(test2 != null && test2.isVisible()){
                  //Whatever
                  getFragmentManager().beginTransaction().remove(getFragmentManager().findFragmentById(R.id.frame_container)).commit();
      
              }
              else
              {
                  super.onBackPressed();
              }
      

      对于 Frag2 和 Frag3,您需要替换按下的特定项目上的特定片段。

      希望对你有帮助:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-13
        • 2016-12-21
        • 2014-03-03
        • 2020-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多