gpt4 book ai didi

Android - 使用 ViewPager 和 fragment 的时间和祖先导航

转载 作者:行者123 更新时间:2023-11-29 18:07:45 25 4
gpt4 key购买 nike

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

目前,用户会看到一个 viewpager,可以在三个主要 fragment (ArtistMain、AlbumMain 和 SongMain)之间进行翻页。在该 View 中选择一个项目后,会发生 fragment 事务,viewpager 会离开 View ,取而代之的是新 fragment (AlbumSub、Songsub 或播放器,具体取决于用户来自何处)。然后用户可以更深入地导航,直到选择一首歌曲,然后他们将被带到“播放器”屏幕。

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

我对 Android 和一般编程还很陌生,而且我似乎无法想出一种有效的方法来实现这一目标。目前,随着每个 fragment 进入 View ,应用程序正在检查用户刚从哪里来,然后确定在调用 back 或 home 时应将用户带到哪里。这意味着我有一个 bool 值,如“fromArtistMain”、“fromAlbumSub”,我正在检查“fromSongSub && fromPlayer”之类的东西。这一切都变得有点困惑。

我画了一个图表(用油漆,对不起!!)来描述我试图实现的导航。黄色代表按下“向上”按钮,红色代表按下“后退”按钮,蓝色只是正常导航。绿色箭头表示 View 分页:

Navigation Diagram

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

感谢您的宝贵时间。

编辑:

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

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

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

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

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

最佳答案

您正在查看的内容称为返回堆栈。您可以在此处阅读更多信息 developer.android.com .

如果您使用单个 Activity 来托管这些 Fragment 中的每一个,那么您可以修改代码以使用如下代码将您的 Fragment 显式添加到 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 个元素开始一个新任务,并在提交您的事务之前离散地在顶部分层 fragment ,实际上每次您“向上”时都会创建一个新的后台堆栈而不是“back”(你的backstack现在是ArtistMain->ArtistSub->SongSub)。这就是我想你想在这里问的问题。这是可能的,但它很困惑。

  • 您可以创建一个更线性的结构(如果可能,这可能是最好的想法)。忽略 backstack 范例,让“back”和“up”总是上升一个级别,无论你来自哪里(Player 总是去 SongSub,SongSub 总是去 AlbumSub)。这将给用户带来最少困惑和最透明(以及最容易实现)的体验——用户将很快学会如何导航(以及要按多少“后退”)以到达他们想去的地方。

关于Android - 使用 ViewPager 和 fragment 的时间和祖先导航,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12525430/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com