底部应用栏在使用片段导航时向上/向下滑动(导航架构组件)

Posted

技术标签:

【中文标题】底部应用栏在使用片段导航时向上/向下滑动(导航架构组件)【英文标题】:Bottom App Bar slide up/down on navigating with fragments (Navigation Architecture Components) 【发布时间】:2019-03-05 14:54:23 【问题描述】:

我正在查看底部应用栏,有一个很好的功能可以将其隐藏在滚动 app:hideOnScroll="true" 上。问题在于,当片段被导航到和离开时,我无法弄清楚如何以编程方式向上或向下滑动它。

例如,设置概述:在MainActivity 上有导航主机片段,它托管MainFragmentDetailFragment

MainFragment 有一个RecyclerView,在滚动时,将隐藏底部应用栏。单击RecyclerView 的任何一项时,它会导航到DetailFragment。但问题是底部应用栏仍然隐藏,我希望它显示出来。

再说一遍:

起始目的地有一个RecyclerView;底部应用栏可见。 单击回收器视图中的一个项目时,它会导航到另一个片段,其中也有一个回收器视图。滚动回收站视图,底部应用栏会向下滑动。 按向上键返回起始目的地,您会发现底部的应用栏仍然隐藏。

有没有什么方法可以让底部应用栏通过导航组件上下滑动?


MainActivity 中,我使用以下代码来获取onCreate 中的向上按钮:
@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    mBottomAppBar = findViewById(R.id.bottom_appbar);
    NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
    NavigationUI.setupActionBarWithNavController(this, navController);

    // ...


@Override
public boolean onSupportNavigateUp() 
    return Navigation.findNavController(this, R.id.nav_host_fragment).navigateUp();

activity_main.xml 中,隐藏底部应用栏我已启用app:hideOnScroll="true"

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    //...

    <fragment
        android:id="@+id/nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_
        android:layout_
        app:defaultNavHost="true"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        app:navGraph="@navigation/nav_graph" />

    <com.google.android.material.bottomappbar.BottomAppBar
        android:id="@+id/bottom_appbar"
        android:layout_
        android:layout_
        app:hideOnScroll="true"
        app:layout_anchor="@+id/nav_host_fragment"
        app:layout_anchorGravity="center|bottom" />

    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/fab"
        android:layout_
        android:layout_
        app:layout_anchor="@id/bottom_appbar" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

依赖关系:

dependencies 
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.0.0'
    implementation 'android.arch.navigation:navigation-fragment:1.0.0-alpha06'
    implementation 'android.arch.navigation:navigation-ui:1.0.0-alpha06'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation 'com.google.android.material:material:1.0.0'
    implementation 'androidx.recyclerview:recyclerview:1.0.0'
    // ...

【问题讨论】:

我也有同样的问题,但是工具栏,你找到解决办法了吗? 【参考方案1】:

我认为您正在寻找 BottomAppBar 的 perfomShow() 方法,如文档 here 所述。我也在使用 v1.1.0 并且该方法在那里,但到目前为止我还没有测试过。当我有能力时会更新这个。

编辑 1:错字

编辑 2:方法有效:Video

【讨论】:

【参考方案2】:

问题与导航组件无关,因为它的行为正确。只需拨打bottom_appbar.show() 以及您的导航代码即可。

【讨论】:

但是没有show方法!依赖是最新的:com.google.android.material:material:1.0.0

以上是关于底部应用栏在使用片段导航时向上/向下滑动(导航架构组件)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Xamarin Forms 中滚动时折叠(隐藏或向上滑动)导航栏(标题栏)?

React - 向下滚动时向上滑动固定导航栏,向上滚动时向下滑动

在 Flutter 中的 Scroll 上隐藏底部导航栏

在 iOS 中上推和交换导航栏

如何让导航栏在滚动到设定点后松开?

UITableView:向上滑动时收缩标签栏和导航栏