当前位置: 首页 > 知识库问答 >
问题:

谷歌照片应用程序底部导航栏行为

齐英耀
2023-03-14

很长一段时间以来,我一直在研究如何保存片段之间的状态,所以当我返回时,就好像你从未离开过一样。谷歌照片就是一个重要的例子。当你滚动浏览你的照片,然后转到另一个片段并返回时,你会保持原样。我的问题是,既然我的应用程序加载了不同的片段,当它们返回到这些片段时,它们会被重新创建,而不是像谷歌照片那样加载以前的状态,那么这怎么可能实现呢。我所尝试的:

定义nav_host_fragment的部分代码,因为它是navView

 appBarConfiguration = new AppBarConfiguration.Builder(
        R.id.navigation_home, R.id.navigation_profile, R.id.navigation_locate, R.id.navigation_contact_messages, R.id.navigation_settings)
        .build();

    navController = Navigation.findNavController(this, R.id.nav_host_fragment);
    //NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
    NavigationUI.setupWithNavController(navView, navController);

    navController = Navigation.findNavController(this, R.id.nav_host_fragment);
    //NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
    NavigationUI.setupWithNavController(navView, navController);

    navView.setOnNavigationItemReselectedListener(menuItem -> {

    });

    navController.addOnDestinationChangedListener((controller, destination, arguments) -> {
        if (destination.getLabel() != null) {
            if (levelsFragment[0].equals(destination.getLabel().toString())) {
                //reemplazar por accion
            } else if (levelsFragment[1].equals(destination.getLabel().toString())) {
                //reemplazar por accion
            } else if (levelsFragment[2].equals(destination.getLabel().toString())) {
                //reemplazar por accion
            } else if (levelsFragment[3].equals(destination.getLabel().toString())) {
                //reemplazar por accion
            } else if (levelsFragment[4].equals(destination.getLabel().toString())) {
                //reemplazar por accion
            }
        }
    });

包含底部导航的Mainactive的xml:

<androidx.constraintlayout.widget.ConstraintLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/main_wrapper"
android:layout_width="match_parent"
android:layout_height="match_parent">

<com.google.android.material.bottomnavigation.BottomNavigationView
    android:id="@+id/nav_view"
    style="@style/bottomNav"
    android:layout_width="0dp"
    app:itemTextColor="@color/quantum_grey"
    android:animateLayoutChanges="true"
    app:labelVisibilityMode="auto"
    app:itemIconTint="@color/colorAccent"
    android:layout_height="wrap_content"
    android:layout_marginStart="0dp"
    android:layout_marginEnd="0dp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:menu="@menu/bottom_nav_menu" />

<fragment
    android:id="@+id/nav_host_fragment"
    android:name="androidx.navigation.fragment.NavHostFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginBottom="?actionBarSize"
    app:defaultNavHost="true"
    app:layout_constraintBottom_toTopOf="@id/nav_view"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:navGraph="@navigation/mobile_navigation" />


</androidx.constraintlayout.widget.ConstraintLayout>

例如,在项目重选中,我将其留空,因为每次我浏览它都会为我创建一个新实例。addOnDestinationChangedListener认为这是保存状态的地方。任何帮助都将不胜感激。这是完美解释我想要实现的页面:Material.io

底部导航在Android和iOS上的行为不同。选择底部导航项目(当前未选择的项目)时,每个平台显示不同的结果:

  • 在Android上:应用程序导航到目的地的顶级屏幕。任何先前的用户交互和临时屏幕状态都会重置,例如滚动位置、选项卡选择和在线搜索

当需要改善用户体验时,可以覆盖默认平台导航。例如,一个需要在分区之间频繁切换的Android应用程序可以保留每个分区的状态。或者,如果iOS应用程序更适合使用情况,它可以将用户返回到顶层屏幕(或重置其滚动位置)。

这是一封来自Google Issue Tracker的电子邮件。在谷歌照片中,我清楚地表达了我的担忧,这是正确的。必须有解决问题的办法

对于使用新导航库和底部导航栏的最终用户来说,此错误的两个最大问题和烦恼是:

  • 使用底部栏更改选项卡会重置前一个选项卡/片段的状态和后退,因此我们的用户完全失去了导航历史记录(这在谷歌照片应用程序中得到了正确的实现)
  • 从一个选项卡的根向后按将显示初始选项卡/片段,而不是离开应用程序“

我通过搜索互联网找到了这个,但它在kotlin中,有些东西我不能很好地理解,我不知道它是否正是我需要的:GitHub中的代码

共有1个答案

靳茂
2023-03-14

我不知道是否有更干净的方法可以做到这一点,但也许你可以尝试保存一些重要的东西来重新创建视图(比如滚动位置和内联搜索),然后在重新打开时自动滚动到旧位置。还可以保存旧实例(如果存在滚动数据),然后在切换回时将旧版本复制回,而不是生成新版本。请小心复制旧屏幕对象,而不是设置引用,因为在生成下一个屏幕对象时,它显然会被删除。。

 类似资料:
  • 我的主要活动中有一个底部导航栏。通过单击底部导航中的一个选项卡,我想更改视图中的片段。我有以下代码:主要活动: } 我的一个片段: 如果我单击其中一个选项卡,就会显示正确的片段,因此这是可行的。然而,当新片段出现时,我想单击另一个选项卡来显示另一个片段,这就行不通了。底部导航栏不会对单击做出反应。甚至日志。i语句不起作用,因此似乎没有调用导航项SelectedListener。 我对android

  • 有人听说过com吗。谷歌。Android应用程序。照片。准许谷歌照片?我似乎在文档中的任何地方都找不到它,但运行4.3及以上版本的用户例外。 如果你有任何关于它的信息,请分享 谢谢你

  • Tabbar 底部导航栏 1.4.8 优点: 此组件一般用于应用的底部导航,具有如下特点: 可以设置凸起的按钮,且是全端通用的 图标可以使用字体图标(内置图标和扩展图标)或者图片 可以动态切换菜单的数量以及配置 切换菜单之前,可以进行回调鉴权 可以设置角标 有效防止组件区域高度塌陷,无需给父元素额外的内边距或者外边距来避开导航的区域 缺点: 虽然优点很多,但是如果用此组件模拟tabbar页面的话依

  • 我有一个具有以下4种布局的项目: 实际上,我有一个活动,其中包含一个底部的应用程序栏和一个NavHostFragment,在那里注入片段。主要片段是主视图。有一个管理和一个设置片段,它们都是与主视图类似的顶级视图,但并不相互依赖。这3个片段可以通过单击导航抽屉中的项目进行切换。为了简化,我正在尝试新的导航架构组件。 现在我有一些设计问题: 我是否应该将底部的应用程序栏移动到片段中,因为它们彼此不依

  • 我的应用程序有能力从库中选择照片。正是我想要的文件路径从这个选择。

  • 我想集成谷歌照片api在Android,我已经做了谷歌登录过程中,但我不能得到访问令牌,因为我得到错误的FixedCreentalsProvider.create方法,而传递参数。