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

时间:2018-09-30 06:11:10

标签: android material-components android-architecture-navigation android-bottomappbar

我正在查看Bottom App Bar,它有一个很好的功能可以将其隐藏在滚动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_width="match_parent"
        android:layout_height="match_parent"
        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_width="match_parent"
        android:layout_height="?android:attr/actionBarSize"
        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_width="wrap_content"
        android:layout_height="wrap_content"
        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'
    // ...

2 个答案:

答案 0 :(得分:0)

我认为您正在寻找here所述的BottomAppBar的perfomShow()方法。我也使用v1.1.0,并且该方法已经存在,但到目前为止我还没有测试过。我将在可能的情况下进行更新。

编辑1:错字

编辑2:该方法有效:Video

答案 1 :(得分:-1)

该问题与导航组件无关,因为它的行为正确。只需调用bottom_appbar.show()并调用导航代码即可。