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

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

方璞
2023-03-14

我正在工作的应用程序由一个导航抽屉组成,它是在一个活动中实现的。活动布局如下:

<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>

这是一个非常常见的模式,唯一经常变化的是容器布局中的片段。

如果片段中有一个滚动元素,在滚动时,CoordinatorLayout会很高兴地进行位置转换,包括Toolbar/AppBarLayout。

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

编辑:可能有bug,AppBarLayout偏移量更改监听器只有在重新启动应用程序时才会被调用(按下后退按钮并打开应用程序),并且在激烈的切换后不再被调用。

共有1个答案

蒋奕
2023-03-14

要重置滚动状态,只需获取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();       

并手动调用onnestedPrescroll方法:

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

如果希望使用动画顺利重置,可以尝试调用onnestedfling:

behavior.onNestedFling(coordinator, appbar, null, 0, -1000, true);
 类似资料:
  • 问题内容: 我正在使用适用于Android的Google Maps API。当我单击标记时,以下代码将启用右下角的地图工具栏 但是,我希望此地图工具栏出现在地图的右上角,而不是默认的右下角位置。 我该怎么做? 问题答案: 发表评论的想法,但是声誉低下。所以: 据我所知,目前尚无法定位。它只会出现在其默认位置。 正如Nathan所说,如果可能,我应该添加一些替代方案。因此,有一个解决方法:您可以禁用

  • 问题内容: 当我打包一个软件包(例如)时,它想创建并安装到其中(这是一个使用库存Go软件包的Ubuntu系统)。 这不是很酷,因为像一个好的Debian用户一样,我只允许.deb软件包将东西安装到中。 我如何说服它安装到我的工作区或下面的某个位置? 问题答案: 正确答案原来是正在安装软件包。

  • 我在玩JavaFX的< code>Tooltip。我意识到对我个人来说,悬停在某个东西上和工具提示实际出现之间的延迟太长了。从API中可以看出: 通常,当鼠标移动到控件上时,工具提示被“激活”。工具提示从“激活”到实际显示之间通常会有一些延迟。细节(如延迟量等)留给皮肤实现。 经过进一步调查,我无法找到任何控制延迟的可能性。JavaFX CSS Reference没有关于延迟时间的信息,的运行时评

  • 问题内容: 我有一张表,像 该对(FieldID,FormID)应该是唯一的,但只有在不删除该行(isDeleted = 0)的情况下,才可以。 是否可以在SQLServer 2008中定义这样的约束?(不使用触发器) PS设置(FieldID,FormID,isDeleted)是唯一的,增加了将一行标记为已删除的可能性,但是我希望有机会将n行(每个FieldID,FormID)设置为isDele

  • 我最近遇到了协调器布局的问题。当我尝试创建简单的折叠工具栏布局(如本例所示)时,工具栏似乎位于状态栏下,如下图所示(在preLolipop设备上,一切都正常,因为应用程序不会在状态栏下绘制)。 我的活动布局的代码片段: My Styles(仅限21版),其中BaseAppTheme父级为Theme.AppCompat.Light.NoActionBar: