需要复杂的Android UI设计指南(片段)

需要复杂的Android UI设计指南(片段),android,android-layout,android-fragments,google-tv,Android,Android Layout,Android Fragments,Google Tv,我正在开发一款针对平板电脑和谷歌电视的应用程序。它将像许多标准的谷歌电视应用程序一样,有一个左导航栏和一个顶部搜索栏,这是所有应用程序屏幕所共有的。它将类似于下图: 主屏幕 所有其他屏幕的红色区域将不同。它可能包含以下屏幕模型之类的数据: 活动一装载到主容器中 活动二装入主容器 因此,您可以看到,完全不同的部分可以加载在主区域中 当在屏幕2中选择任何列表项(比如在片段列表中)时,屏幕3可以作为详细部分加载,也可以作为选择选项卡(将显示在LeftNavBar中)的结果加载 下面是我如何尝试实

我正在开发一款针对平板电脑和谷歌电视的应用程序。它将像许多标准的谷歌电视应用程序一样,有一个左导航栏和一个顶部搜索栏,这是所有应用程序屏幕所共有的。它将类似于下图:

主屏幕

所有其他屏幕的红色区域将不同。它可能包含以下屏幕模型之类的数据:

活动一装载到主容器中

活动二装入主容器

因此,您可以看到,完全不同的部分可以加载在主区域中

当在屏幕2中选择任何列表项(比如在片段列表中)时,屏幕3可以作为详细部分加载,也可以作为选择选项卡(将显示在LeftNavBar中)的结果加载

下面是我如何尝试实现它的

步骤1。我用以下XML创建了一个主要活动:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="#9ccc" >

        <!-- Top Bar -->

    </LinearLayout>

    <FrameLayout
        android:id="@+id/mainContainer"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

        <!-- main Red Container that will load other Activities -->

    </FrameLayout>
</LinearLayout>
但是
getWindow()
返回
null

发生其他问题,因为所有数据都来自远程服务。。因此,还请建议如何在某种堆栈中保存对
maincainer
中所有已加载活动的引用。。。因此,我可以重新加载已加载的活动,而不是创建其新实例。。这将在按下后退按钮时使用

我不应该将一个活动加载到上面的红色容器中,而是应该创建两个活动,每个活动都有自己的片段&LeftNavBar。这可能比前面提到的方法更容易。或者这可能是唯一的解决办法。。。。然而,我觉得为后退按钮保存状态可能会变得混乱。。但我会尝试实现这一点

如果必须创建这种类型的应用程序,您会怎么做? 您将如何设计UI布局以获得最佳性能/实践


非常感谢您帮助我设置此应用程序布局的建议。

Re:嵌套碎片问题


为了解决应用程序中的“嵌套片段”问题(正如您正确指出的)
Fragment
s无法添加
Fragment
s,我在活动下托管了一个模板片段,其唯一目的是为其他片段定义一组定位点。当添加更多的片段到活动中超过这一点时,我使用模板片段的视图占位符
+@id
s来标识所添加片段的“根”或父视图id

    getSupportFragmentManager().beginTransaction().add(#someIdFromTheTemplateFrag, fragment, fragmentTag).commit();

我添加的片段知道在当前布局中锚定自己的位置,当然,然后以一种愉快的方式添加视图。这样做的效果是将一个片段附加到另一个片段上,从而实现所需的视觉“嵌套”…

免责声明

这就是碎片可能变得棘手的地方。如果活动1和2具有相同的布局,那么问题将很简单,这样您就可以简单地附加/分离片段,并使用片段回栈来展开

因为你需要2个独特的布局来容纳你的片段,所以事情会变得更加复杂。如果可能的话,我会尽量使用相同的布局,这样你就可以走简单的路

作为另一种选择,您可以使用上面概述的两个活动,并通过意图来回发送数据

这就是说,如果我真的必须按照所写的方式实现这个解决方案,下面是我将要做的。请注意,我并不是在提倡这种解决方案,但我自己不知道有更好的方法

解决方案

创建一个FragmentActivity,其视图将是上面定义的主屏幕。主屏幕的布局将包含:

  • 左导航条
  • 顶杆
  • 2布局。布局1和布局2。这些将包含在父布局(即RelativeLayout或LinearLayout)中,并包含片段所需的FrameLayout元素
使用XML的示例(注意,标记有点简短):


主要思想是,然后根据应用程序的状态显示/隐藏布局1和布局2,即设置android:visibility=“gone”

这种方法的缺点是:

  • 使用片段backback可能是不可能的,相反,您必须跟踪用户在UI流中的位置,并管理back按钮以显示/隐藏布局
  • 在显示/隐藏片段的父视图时,可能需要特别注意附加/分离片段,以减少片段不可见时的资源消耗
优点是:

  • 片段和基本活动之间的通信很容易,因为只使用了1个活动

这不仅没有回答他的问题—您正在推广不正确的片段使用,嵌套片段可能会导致微妙的生命周期错误,并且不保证在未来的版本中起作用。他可以使用简单的布局轻松地创建所需的效果,将其片段固定在一起,无需嵌套。Ref:这里描述的没有层次嵌套。活动仍然直接拥有所有片段。这种方法允许您通过模块化的、可重用的片段控制流视图-不会有任何细微的错误,因为活动仍然直接拥有片段,它可以随意销毁、重新创建和附加,但是片段的定位可以由这个“控制器”片段控制。“我在活动下托管了一个模板片段,其唯一目的是为其他片段定义一组占位符以锚定。”-听起来像是在片段中放置一个片段到meth您链接到的问题是在代码中向片段添加一个片段(或者至少我是这样理解的)从而模糊了谁控制Frag之间的界限
    getSupportFragmentManager().beginTransaction().add(#someIdFromTheTemplateFrag, fragment, fragmentTag).commit();
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="#9ccc" >

        <!-- Top Bar -->

    </LinearLayout>

    <LinearLayout android:id="@+id/layout1">
        <FrameLayout android:id="@+id/listFragment" />
        <FrameLayout android:id="@+id/contentFragment" />
    </LinearLayout>

    <LinearLayout android:id="@+id/layout2">
        <FrameLayout android:id="@+id/imageFragment" />
        <FrameLayout android:id="@+id/boxFragment1" />
        <FrameLayout android:id="@+id/boxFragment2" />
        <FrameLayout android:id="@+id/boxFragment3" />
    </LinearLayout>

</LinearLayout>