1

对于我正在开发的音乐播放器,我正在尝试找出实现“祖先”和“临时”导航(使用向上按钮和后退按钮)的最佳方式。

目前,用户会看到一个viewpager,并且可以在三个主要片段(ArtistMain、AlbumMain 和SongMain)之间进行分页。在该视图中选择一个项目后,会发生片段事务,并且 viewpager 会消失,并被新片段(AlbumSub、Songsub 或播放器,取决于用户来自何处)替换。然后用户可以更深入地导航,直到选择一首歌曲,然后他们被带到“播放器”屏幕。

我想问题是:如何实现所有这些条件导航?

总的来说,我对 android 和编程还很陌生,而且我似乎无法想出一种有效的方法来实现这一点。目前,随着每个片段的出现,应用程序正在检查用户刚刚从哪里来,然后确定如果返回或回家,用户应该被带到哪里。这意味着我有一个像“fromArtistMain”,“fromAlbumSub”这样的布尔值,我正在检查像“fromSongSub && fromPlayer”这样的东西。这一切都变得有点混乱。

我画了一张图(在油漆中,对不起!!),来描绘我想要实现的导航。黄色代表“向上”按钮按下,红色是“返回”按钮按下,蓝色只是正常导航。绿色箭头表示视图分页:

导航图

欢迎任何建议。这可能需要一些我刚刚忽略的非常简单的东西。

谢谢你的时间。

编辑:

我一直在向后台堆栈添加片段,并使用 popBackStack() 调用,问题是弹出后台堆栈不一定是每种情况下的正确选项。

我目前有一大堆代码试图确定是否应该首先将事务添加到后台堆栈。

考虑以下情况:用户直接从“SongMain”中选择一首歌曲,并被带到“播放器”。现在应该(在我看来)使用主页按钮,将用户带到 SongSub(所选歌曲所属专辑中的歌曲列表)。现在,如果用户再次向上导航,他们将被带到“AlbumSub”,即该艺术家的专辑列表。这是一个片段事务,但添加到后台堆栈将意味着用户将在后台按下时降低一个级别(我认为这是出乎意料的)。所以在这种情况下,我不会将该特定事务添加到后台堆栈 - 看起来很好,但是有很多不同的情况,并且结合顶部需要进出可见性的 viewpager,代码变得真的凌乱。

所有这一切都意味着一大堆条件决定用户来自哪里以及他们到达那里的路径。

在主机活动中根据用户导航的位置设置一堆布尔值,然后检查这些布尔值以查看是否应将事务添加到后台堆栈中是否明智?这是我已经拥有的,但似乎效率很低。

4

1 回答 1

3

您正在查看的内容称为Back stack. 您可以在developer.android.com上阅读更多相关信息。

如果您使用单个 Activity 来托管这些 Fragment 中的每一个,那么您可以修改您的代码以使用如下代码将您的 Fragments 显式添加到 Fragment Back 堆栈:

    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();       
    transaction.replace(R.id.container, fragment);      
    transaction.addToBackStack("NameOfFragment");
    transaction.commit();       

因此,如果您使用 Fragments 执行上述代码,如下所示:

Fragment1 -> Fragment2 -> Fragment3 -> Fragment4

然后从Fragment4如果你调用这个方法:

getSupportFragmentManager().popBackStackImmediate();

然后Fragment4将完成并Fragment3重新启动。简单的。您可以通过单击按钮调用此行,也可以覆盖后退按钮的行为来调用它。

请注意,在示例中,我使用getSupportFragmentManager()了 Compatibility Package 中的方法名称函数。如果您不使用兼容性包,则可以改为调用getFragmentManager().

编辑

您设想的导航问题是,在中途打破 backstack 范式意味着您的应用程序将与操作系统的其余部分“行为不同”。谷歌大体上不鼓励这种做法。但是话又说回来,出于非常相似的原因,我在我的应用程序中做了完全相同的事情:)。

当您沿着一条黄线“向上”导航时,您正在跟踪一个离散的链接(所以,startActivity(new Intent(this, SongSub));或其他),并且您希望它“打破”后堆。

在这个阶段,您可以决定如何前进:

  • 您可以使用 SongSub 作为第 0 项来启动任务(backstack)。这是谷歌音乐应用程序所做的记忆,你是对的,这很烦人。当您按下返回时,它应该在技术上退出应用程序。玉。IMO,如果您处于明显的页面层次结构中,则应始终在退出应用程序时向下导航层次结构。

  • 您可以使用 ArtistMain 作为第 0 个元素开始一个新任务,并在执行commit事务之前将层片段离散地放在顶部,实际上每次您“向上”而不是“返回”时都会创建一个新的后台堆栈(您的后台堆栈现在是 ArtistMain->ArtistSub ->宋子)。这就是我认为你想在这里问的问题。这是可能的,但它很混乱。

  • 您可以创建一个更线性的结构(如果可能,这可能是最好的主意)。忽略 backstack 范式,让“back”和“up”无论你来自哪里总是上一个级别(Player 总是去 SongSub,SongSub 总是去 AlbumSub)。这将为用户提供最少混淆和最透明(以及最容易实现)的体验 - 用户将快速学习如何导航(以及按下多少“后退”)以到达他们想要的位置。

于 2012-09-24T12:37:18.100 回答