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

时间:2014-05-01 18:40:16

标签: android android-layout android-fragments android-navigation

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

在手机上只能看到一个片段,在平板电脑上有两个片段可见。

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

enter image description here

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

此屏幕是带有片段A和B的配置 enter image description here

此屏幕包含片段B和C. enter image description here

问题是:我是否应该使用单个Activity实现此功能,其中

  • 对于手机我将有一个FrameLayout用于片段
  • 对于平板电脑我将有两个FrameLayouts用于' left'并且'对'片段?

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

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

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

我真的不知道该做什么或在哪里看,请告知。

3 个答案:

答案 0 :(得分: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();

作为最后一点,当给每个片段充气时,必须设置LinearLayout的布局参数WEIGHT来控制片段的宽度。这样的事情:

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

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

如果您想知道如何设置这些交易的动画,请参阅我在https://stackoverflow.com/a/14155204/906362之前提供的答案

答案 1 :(得分:1)

我为你的问题做了一些研究,我不认为同样的程序对手机和桌子有效,但如果是这样的话,请查看:

        FragmentManager fragmentManager = getFragmentManager();
        fragmentManager.beginTransaction()
                .replace(R.id.frame_container, fragment).commit();

这是负责更改片段的代码的一部分,最初取自Here

本教程介绍了完成平板电脑设计的所有步骤。

每当我需要android帮助时,我都会参考这个网站! 享受!!

答案 2 :(得分:1)

如您所知,细分适用于reusing GUI parts

通过我必须承认我没有看到直接解决A-B B-C C-D方案的代码示例或教程,但这甚至涉及各种活动。如果活动1可以使用B的分段实例,那么活动2可以运行其自己的B分段实例。您还可以直接从应用程序中(和外部)的其他位置链接到活动2。

在活动1之外定义B段,并在A-B和B-C中使用in。然后startActivityForResult()活动2,它实例化另一个B段。当用户使用后退按钮时,它们应该以活动1结束,并显示其B段的最新状态。

你甚至可以尝试在一个活动中进行所有段重用..但我没有看到除了GUI过渡动画之外的优势。