【问题标题】:Swapping Fragments in a Single Activity?在单个活动中交换片段?
【发布时间】:2011-06-15 16:22:01
【问题描述】:

在平板电脑上,我们有两个相邻的片段(相同数据的两个不同视图)。在移动设备上,我们希望通过按一下按钮在这两个片段之间切换。移动布局如下所示:

<RelativeLayout>
  <fragment id="container" name="fragA"/>
  <ImageButton onClick="swapFragments" />
</RelativeLayout>

在活动的swapFragments(View) 方法中,我尝试使用FragmentManagerfragA 替换为fragB

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.container, new FragB());
fragmentTransaction.commit();

...但是我总是可以通过fragB 的透明部分看到fragA,这让我相信它只是将fragB 放在fragA 之上,而不是替换它。

我开始在事务中使用hide(Fragment) 和类似方法,但这看起来不是正确的方法。

关于如何正确交换这些片段的任何提示?

编辑:我看到了this question 的答案。不过,这让我很困惑,因为我需要能够为平板电脑和手机指定不同的布局。如果我必须以编程方式添加片段,如何避免特定于活动中每个布局的代码(即

 if(TABLET) {
   addFragmentA();
   addFragmentB();
 } else {
   addFragmentA();
 }

【问题讨论】:

  • 你找到解决这个问题的方法了吗?

标签: android layout android-fragments


【解决方案1】:

不要混合使用 XML 和代码创建的片段 - 会发生不好的事情。在布局中保留一个容器视图,然后在其中添加/替换片段(其中没有第一个片段)。

【讨论】:

    【解决方案2】:

    对我来说看起来不错,我正在做类似的事情,尽管我使用add 从活动中添加我的初始片段,而不是通过在布局中引用它来加载它。那里可能有一个错误。仅供参考,我正在使用兼容性库。

    可能值得一试:

    1) 将事务添加到后台堆栈以查看是否会有所不同,看来您可能还是想要该功能。

    2) 给布局中的片段一个 id 或标签,然后使用它来执行 removeadd fragB。

    3) 尝试从代码中加载您的 fragA,看看是否会有所不同。

    【讨论】:

      【解决方案3】:

      好吧,首先您可以尝试使用 newInstance() 工厂方法来实例化片段 B,而不仅仅是 new FragB()。 但是,我认为这不是问题。

      你能尽量不要在你的 XML 布局中使用片段标签吗? 只需执行以下操作:

      <RelativeLayout>
        <Linear/FrameLayout id="container" name="fragA"/>
        <ImageButton onClick="swapFragments" />
      </RelativeLayout>
      

      因此,可以像 Frame 或 LinearLayout 一样使用 Fragment 的容器,并在 Fragment 的 onCreateView 回调中对其进行膨胀。也许有帮助,请告诉我。

      干杯!

      【讨论】:

        【解决方案4】:

        据我所知,您没有隐藏/分离前一个片段,因此两者都会显示。你可以实现这样的东西:

                if (mFragment != null) { 
                    ft = mActivity.getSupportFragmentManager().beginTransaction();  
                    ft.hide(mFragment);                 
                    ft.detach(mFragment);
                    ft.commitAllowingStateLoss();
                }
        

        【讨论】:

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