如何重置CoordinatorLayout控制的工具栏位置?

raz*_*zle 50 android navigation-drawer android-design-library androiddesignsupport

我正在开发的应用程序包含一个在Activity中实现的导航抽屉.活动布局如下:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

<android.support.v4.widget.DrawerLayout
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.CoordinatorLayout
        android:id="@+id/coordinator"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <FrameLayout
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <include
            android:id="@+id/appbar"
            layout="@layout/appbar" />

    </android.support.design.widget.CoordinatorLayout>

    <android.support.design.widget.NavigationView
        android:id="@+id/navigation_drawer"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:headerLayout="@layout/header_drawer"
        app:menu="@menu/menu_nav">
    </android.support.design.widget.NavigationView>

</android.support.v4.widget.DrawerLayout>

</FrameLayout>
Run Code Online (Sandbox Code Playgroud)

这是一种非常常见的模式,只有经常更改的是容器布局中的Fragment.

如果任何片段具有滚动元素,则在滚动时,CoordinatorLayout将很乐意进行位置转换,包括工具栏/ AppBarLayout.

这里真正的问题是,当Fragment被替换时,工具栏的位置保持不变,即,如果隐藏工具栏,它将保持不变.

结果如下:

这个:

滚动后

卡住:

然后改变

如何在这种情况下重置工具栏位置?

编辑: 可能是一个错误,只有在重新启动应用程序时才会调用AppBarLayout偏移更改侦听器(按下后退按钮并打开应用程序),并在激烈的投掷后停止再次调用.

Mat*_*ala 46

要重置滚动状态,只需获取AppBarLayout.Behavior对象

CoordinatorLayout coordinator = (CoordinatorLayout) findViewById(R.id.coordinator);
AppBarLayout appbar = (AppBarLayout) findViewById(R.id.appbar);
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appbar.getLayoutParams();
AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();       
Run Code Online (Sandbox Code Playgroud)

onNestedPreScroll手动调用方法:

int[] consumed = new int[2];
behavior.onNestedPreScroll(coordinator, appbar, null, 0, -1000, consumed);
Run Code Online (Sandbox Code Playgroud)

如果您想通过动画顺利重置,可以尝试调用onNestedFling:

behavior.onNestedFling(coordinator, appbar, null, 0, -1000, true);
Run Code Online (Sandbox Code Playgroud)


小智 33

首先在MainActivity中获取AppBarLayout引用,然后在要替换的片段的暂停状态下,使用下面的方法展开工具栏:

MainActivity.appbar.setExpanded(true,true);
Run Code Online (Sandbox Code Playgroud)

或者关闭工具栏:

MainActivity.appbar.setExpanded(false,true);
Run Code Online (Sandbox Code Playgroud)

第二个参数用于平滑滚动工具栏.

  • @MuhammadBabar更新您的依赖项,兄弟. (2认同)

Con*_*ext 13

将支持库更新到v23,然后您可以使用:

appBarLayout.setExpanded(true/false);
Run Code Online (Sandbox Code Playgroud)

public void setExpanded(boolean expanded)

设置是否展开此AppBarLayout,动画是否已经布局.

与AppBarLayout的滚动一样,此方法依赖于此布局是CoordinatorLayout的直接子代.

扩大 true,如果布局应充分扩大,假是否应该完全倒塌