Android - Temporal&使用ViewPager进行祖先导航&片段

时间:2012-09-21 06:39:47

标签: android navigation android-fragments android-viewpager

我正在努力找出实现“祖先”和“时间”导航(利用向上按钮和向后按钮)的最佳方式,对于我正在制作的音乐播放器。

目前,用户会看到一个viewpager,并且可以在三个主要片段(ArtistMain,AlbumMain和SongMain)之间进行分页。在该视图中选择一个项目时,会发生一个片段事务,并且viewpager会退出视图,由一个新片段(AlbumSub,Songsub或播放器,取决于用户来自哪里)取代。然后,用户可以更深入地导航,直到选择了一首歌曲,然后将它们带到“播放器”屏幕。

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

我对Android和编程很新,我似乎无法想出一种有效的方法来实现这一点。此时,当每个片段进入视图时,应用程序将检查用户刚刚来自何处,然后确定在调用后台或主页时应该在何处使用该用户。这意味着我有一个像“fromArtistMain”,“fromAlbumSub”这样的布尔,我正在检查像“fromSongSub&& fromPlayer”这样的东西......这一切都变得有些混乱。

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

Navigation Diagram

欢迎任何建议。我可能会忽略一些非常简单的事情。

感谢您的时间。

编辑:

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

我目前收到了大量代码,试图确定是否应该首先将事务添加到Backstack中。

请考虑以下事项: 用户直接从'SongMain'中选择一首歌曲,并被带到'Player'。现在使用主页按钮(在我看来),将用户带到SongSub(所选歌曲所属的专辑中的歌曲列表)。现在,如果用户再次导航,他们将被带到'AlbumSub',即该艺术家的专辑列表。这是一个片段事务,但添加到backstack意味着用户将被按下一个级别(我认为这是意料之外的)。所以在这种情况下我不会将该特定事务添加到backstack - 看起来很好,但是有很多不同的情况,并且结合顶部的viewpager需要进入和退出可见性,代码真的凌乱。

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

根据用户导航的位置,在主机活动中设置一堆布尔值是否明智,然后检查这些布尔值以查看是否应该在后台堆叠中添加交易?这是我已经拥有的,但它看起来效率很低。

1 个答案:

答案 0 :(得分:3)

您正在研究的内容称为Back stack。您可以在developer.android.com了解更多相关信息。

如果你使用一个Activity来托管这些片段中的每一个片段,那么你可以修改你的代码以明确地使用如下代码将片段添加到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(),它是兼容包中的方法名称。如果您没有使用兼容性套餐,则可以拨打getFragmentManager()

修改

您设想的导航问题是,在中途退出后台模式意味着您的应用程序将“比其他操作系统更加不同”。这基本上是谷歌劝阻的。但话说回来说,我在我的应用程序中做的完全相同,原因非常相似:)。

当你沿着你的一条黄线“向上”导航时,你正在关注一个离散的链接(所以,startActivity(new Intent(this, SongSub));或其他什么),你希望这个“打破”后台堆。

现阶段您可以决定如何前进:

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

  • 你可以使用ArtistMain作为第0个元素开始一个新的任务,并且在commit交易之前离散地在ontop上进行分段,实际上每次你“向上”而不是“返回”时创建一个新的backstack “(你的后座现在是ArtistMain-> ArtistSub-> SongSub)。这就是我想你在这里问的问题。这是可能的,但它很混乱。

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