Android:如何从一个 "detail" 导航到另一个 "detail",同时让 "Up" 按钮返回到 "Master" 列表?

Android: How can I navigate from one "detail" to another "detail", while having the "Up" button go back to the "Master" list?

我的应用程序中有主从模式,但我希望细节能够切换视图。我想尽可能多地节省 space,这样 "content" 就又漂亮又宽敞。 如何从一个 "detail" 导航到另一个 "detail",同时让 "Up" 按钮返回到 "Master" 列表?(请参阅我图片上 "Detail 1" 和 "Detail 2" 之间的箭头。)

我花了很多时间思考这个问题并研究了各种方法,甚至问了一个堆栈溢出问题 (),我仍在等待有用的答案。即使我回答了这个问题,我也不确定它是否真的适用于像这样的 Master Detail 流程。

如果 Master-Detail 不起作用,完成我想要的 UI 布局的最佳方法是什么? 有没有人做过这样的事情前?谢谢!


编辑:理想情况下,我还希望用户能够设置一个 "Default" 视图(详细信息 1 或详细信息 2),这将是点击后出现的第一个屏幕大师列表中的一个项目。


编辑 2:我想使用 ViewPager 在 Detail 1 和 Detail 2 之间进行转换。不过我不确定它是否可行。或者,我可以使细节 2 在细节 1 的基础上额外 activity,但我不想为我的 "content" 区域中的按钮制作 space。 我真的不能使用抽屉,因为抽屉图标和 "Up" 箭头在同一个地方。我很茫然,因为我认为抽屉最适合这种情况,但我不能使用它,因为我已经在使用 "Up" 箭头。


编辑 3:我试着想出一个应用程序来完成我想做的事情,我认为 "Kindle" 做得很好。它必须在一本书的每一页之间切换,但首先你必须选择一本书。当您在 Kindle 上看书时,操作栏和导航抽屉变为白色,导航抽屉的第一项是 "Library." 单击 "Library" 将带您进入完全不同的 activity带有不同菜单项的黑色操作栏和黑色导航抽屉。所以,我想这可能是我应该走的路。我应该不再有 "Up" 按钮,而只使用抽屉的第一项作为 "Up" 按钮。不过,我仍然有兴趣学习和考虑我的所有选择。

我会这样解决:

  • 大师(MainActivity 内的片段)
  • 细节 1(FirstDetailActivity 内的片段)
  • 细节 2(SecondDetailActivity 内的片段)

清单文件(例如):

<application>

    <!-- The main/home activity (it has no parent activity) -->
    <activity
        android:name="...MainActivity" ...>
        ...
    </activity>


   <!-- First detail activity -->
   <activity
       android:name="...FirstDetailActivity"
       android:parentActivityName="...MainActivity" >
       <!-- Parent activity meta-data to support 4.0 and lower -->
       <meta-data
           android:name="android.support.PARENT_ACTIVITY"
           android:value="...MainActivity" />
   </activity>

   <!-- Second detail activity -->
   <activity
        android:name="...SecondDetailActivity"
        android:parentActivityName="...MainActivity" >
        <!-- Parent activity meta-data to support 4.0 and lower -->
        <meta-data
           android:name="android.support.PARENT_ACTIVITY"
           android:value="...MainActivity" />
   </activity>

</application>

所以基本上:

  1. 点击列表(Master)打开 FirstDetailActivity
  2. 点击 FirstDetailActivity(Tab、Spinner、Button 等)打开 SecondDetailActivity
  3. FirstDetailActivity 或 SecondDetailActivity 中的向上按钮提供到 MainActivity 的导航

参考:http://developer.android.com/training/implementing-navigation/ancestral.html

这是使用 FragmentViewPager 的替代方法(因为它们通常可以以更多样板代码结尾)。

将您的所有细节视图集中在一个 layout.xml 中,然后通过 View.setVisibility() 单击按钮切换它们的可见性。您可以将此按钮标记为 "Continue"、"Next" 或其他名称。主要思想是让用户意识到尽管屏幕发生变化,他们仍处于相同的上下文中。

这里有一个说明,说明您应该如何安排您的详细信息layout.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent">
    <LinearLayout
        android:id="@+id/layout_page_1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="visible">

        <!-- Put your detail 1 content here -->

    </LinearLayout>

    <LinearLayout
        android:id="@+id/layout_page_2"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="gone">

        <!-- Put your detail 2 content here -->

    </LinearLayout>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Continue"
        android:id="@+id/bt_continue"/>

</RelativeLayout>

正如我所说,我的想法是在 bt_continue 被点击时切换 layout_page_1layout_page_2 的可见性:

@Override
public void onClick(View v) {
    if(v.getId() == R.id.bt_continue) {
        layoutPage1.setVisibility(View.INVISIBLE);
        layoutPage2.setVisibility(View.GONE);
    }
}

使用此逻辑,您还可以实现一个 "Previous" 按钮以导航回您的详细信息的第一页。

如果您希望您的用户能够设置默认视图,那也很容易。只需在您的 SharedPreferences 中保存一个 int,它将代表将成为 "opened" 的页面 - 即将设置为 View.VISIBLE 的视图 - 您的用户第一次打开详细视图。

将您的详细信息页面实现为片段,并使用 ViewPager 来保存它们。这样,用户可以通过向左或向右滑动来在两者之间切换。例如,如果您查看 Gmail 应用程序,您还可以在打开邮件列表中的邮件后轻扫邮件详细信息。