需要复杂的Android UI设计指南(片段)
我正在开发一款针对平板电脑和谷歌电视的应用程序。它将像许多标准的谷歌电视应用程序一样,有一个左导航栏和一个顶部搜索栏,这是所有应用程序屏幕所共有的。它将类似于下图: 主屏幕 所有其他屏幕的红色区域将不同。它可能包含以下屏幕模型之类的数据: 活动一装载到主容器中 活动二装入主容器 因此,您可以看到,完全不同的部分可以加载在主区域中 当在屏幕2中选择任何列表项(比如在片段列表中)时,屏幕3可以作为详细部分加载,也可以作为选择选项卡(将显示在LeftNavBar中)的结果加载 下面是我如何尝试实现它的 步骤1。我用以下XML创建了一个主要活动:需要复杂的Android UI设计指南(片段),android,android-layout,android-fragments,google-tv,Android,Android Layout,Android Fragments,Google Tv,我正在开发一款针对平板电脑和谷歌电视的应用程序。它将像许多标准的谷歌电视应用程序一样,有一个左导航栏和一个顶部搜索栏,这是所有应用程序屏幕所共有的。它将类似于下图: 主屏幕 所有其他屏幕的红色区域将不同。它可能包含以下屏幕模型之类的数据: 活动一装载到主容器中 活动二装入主容器 因此,您可以看到,完全不同的部分可以加载在主区域中 当在屏幕2中选择任何列表项(比如在片段列表中)时,屏幕3可以作为详细部分加载,也可以作为选择选项卡(将显示在LeftNavBar中)的结果加载 下面是我如何尝试实
<?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元素
主要思想是,然后根据应用程序的状态显示/隐藏布局1和布局2,即设置android:visibility=“gone”
这种方法的缺点是:
- 使用片段backback可能是不可能的,相反,您必须跟踪用户在UI流中的位置,并管理back按钮以显示/隐藏布局
- 在显示/隐藏片段的父视图时,可能需要特别注意附加/分离片段,以减少片段不可见时的资源消耗
- 片段和基本活动之间的通信很容易,因为只使用了1个活动
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>