平板电脑的Android片段导航 - 单个或多个活动?

Axa*_*dax 12 android android-layout android-fragments android-navigation

我想实现这样的导航(下图),其中片段A,B,C,D表示在应用程序的信息层次结构中向下导航.

在电话上只能看到一个片段,在平板电脑上有两个片段可见.

我见过的所有教程和文档(例如thisthis)都提到了Master-Detail视图,左边有一个主片段,右边有一个详细视图,但似乎没有人指定如何钻从细节更深入.

在此输入图像描述

事实上,平板电脑的GMail应用程序可以作为我自己的应用程序.假设片段A是帐户和文件夹列表,片段B是电子邮件列表,片段C是会话本身.

该屏幕是具有片段A和B的配置 在此输入图像描述

该屏幕具有片段B和C. 在此输入图像描述

问题是:我应该用一个Activity来实现它,其中

  • 对于手机我将有一个FrameLayout片段
  • 对于平板电脑,我将为"左"和"右"片段设置两个FrameLayouts?

如果是这样,我将如何插入新片段?在FragmentTransaction中,我有两个可用的操作 - add()replace().

  • 如果我使用add(),那么下面的片段似乎还活着(它们没有进入暂停状态)并保持完整状态(但可能会浪费一些资源)(因此在片段D中,所有C,B和A仍将存在),在后退按钮上,滚动状态和加载的数据仍然存在
  • 如果我使用replace(),那么之前的片段将被移除,因此在任何时刻顶部将只有一个(在电话上)片段,并且在后退按钮上交易将被反转,旧片段被添加回去,但它赢了不记得以前的状态

这些选项对我来说都不合适.教程在FragmentTransaction中使用replace() - 但是它们如何恢复前一个片段的状态,例如在GMail应用程序中,电话片段B从服务器加载无限滚动,然后当我用片段C替换它时然后回去,B应该出现在它停止的地方,对吧?

我真的不知道该做什么或在哪里看,请指教.

Bud*_*ius 7

仅使用1个活动,但每个活动使用不同的FragmentTransactions.使用LinearLayout作为活动的根,让我们调用它R.id.content 并创建一个新的XML值,如下所示:

  • /values/device.xml

    <item type="bool" format="boolean" name="isPhone">true</item>

  • /values-sw600dp/device.xml

    <item type="bool" format="boolean" name="isPhone">false</item>

那么你的交易就像:

  FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
  Frag_C f = new Frag_C();
  if(getResources().getBoolean(R.bool.isPhone)){ // phone
     ft.replace(R.id.content, f, Frag_C.TAG);
  }else { // tablet
     Fragment left = getSupportFragmentManager().findFragmentByTag(Frag_A.TAG);
     Fragment right = f;
     ft.hide(left);
     ft.add(R.id.content, right, FRAG_C.TAG);
  }
  ft.addToBackStack(null).commit();
Run Code Online (Sandbox Code Playgroud)

并且作为最后一点,当给每个片段充气时,你必须设置WEIGHTLinearLayout 的布局参数来控制片段的宽度.像这样的东西:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
   View v = inflater.inflate(layoutId(), container, false);
   ((LinearLayout.LayoutParams) v.getLayoutParams()).weight = 1;
}
Run Code Online (Sandbox Code Playgroud)

因此,fragA权重为1,则B = 2,则C = 4,然后D = 8(例如).所以左边的碎片宽度为33%,右边的宽度为66%.根据需要改变价值观.

如果您想知道如何为这些交易制作动画,请参阅我在/sf/answers/990864311/之前给出的答案