You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

点击选项菜单时Collapsing Toolbar出现滚动异常问题

解决CollapsingToolbar半展开时选项菜单点击异常的问题

你遇到的这个问题是典型的CoordinatorLayout布局动画与CollapsingToolbarLayout滚动动画冲突导致的。当CollapsingToolbar处于半展开状态时,布局本身正处于动态调整的中间状态,此时触发视图可见性变化(比如你的保存按钮显示/隐藏),再加上根布局的android:animateLayoutChanges="true",会让系统同时处理两种动画逻辑,最终导致视图错乱和菜单状态异常。

解决方案步骤

  • 移除根布局的全局动画属性:删掉CoordinatorLayout上的android:animateLayoutChanges="true",这个属性会干扰CollapsingToolbar的滚动状态。
  • 单独给需要动画的区域加属性:如果需要保存按钮显示/隐藏时有动画,给包含mp_btn_save的父布局设置android:animateLayoutChanges="true",而非全局加在根布局上。
  • 确保菜单引用正确初始化:在onCreateOptionsMenu中统一获取菜单item的引用,避免状态切换时出现引用失效的情况。

修改后的布局代码(myprofile.xml)

<android.support.design.widget.CoordinatorLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:fab="http://schemas.android.com/apk/res-auto" 
    xmlns:fresco="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/mp_coordinator" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@color/semi_white" 
    android:fitsSystemWindows="true" 
    tools:context=".MyProfile">

    <android.support.design.widget.AppBarLayout 
        android:id="@+id/mp_app_bar" 
        android:layout_width="match_parent" 
        android:layout_height="256dp" 
        android:elevation="4dp" 
        android:fitsSystemWindows="true" 
        app:theme="@style/ThemeOverlay.AppCompat.Light">

        <android.support.design.widget.CollapsingToolbarLayout 
            android:id="@+id/mp_collapsing" 
            android:layout_width="match_parent" 
            android:layout_height="wrap_content" 
            android:fitsSystemWindows="true" 
            app:contentScrim="@color/colorPrimary" 
            app:layout_scrollFlags="scroll|exitUntilCollapsed" 
            app:theme="@style/ThemeOverlay.AppCompat.Dark">

            <ImageView 
                android:src="@drawable/user_default" 
                android:id="@+id/mp_iv_profile" 
                android:layout_width="match_parent" 
                android:layout_height="match_parent" 
                android:scaleType="centerCrop" 
                app:layout_collapseMode="parallax" />

            <android.support.v7.widget.Toolbar 
                android:id="@+id/mp_toolbar" 
                android:layout_width="match_parent" 
                android:layout_height="?android:attr/actionBarSize" 
                app:layout_collapseMode="pin" 
                android:fitsSystemWindows="false" 
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

            <TextView 
                style="@style/ToolbarsTv" 
                android:id="@+id/mp_tv_title" 
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content" 
                android:layout_gravity="center_horizontal" 
                android:layout_marginTop="16dp" 
                app:layout_collapseMode="pin" />

        </android.support.design.widget.CollapsingToolbarLayout>
    </android.support.design.widget.AppBarLayout>

    <include layout="@layout/content_scrolling"/>
</android.support.design.widget.CoordinatorLayout>

修正后的菜单点击代码

private MenuItem item_edit;
private MenuItem item_cancel;

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.your_menu_layout, menu);
    // 在这里统一初始化菜单item引用
    item_edit = menu.findItem(R.id.mp_options_menu_edit);
    item_cancel = menu.findItem(R.id.mp_options_menu_cancel);
    // 设置初始状态:取消按钮隐藏
    item_cancel.setVisible(false);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    switch (id) {
        case android.R.id.home:
            onBackPressed();
            break;
        case R.id.mp_options_menu_edit:
            mp_btn_save.setVisibility(View.VISIBLE);
            item_edit.setVisible(false);
            item_cancel.setVisible(true);
            onEdit();
            break;
        case R.id.mp_options_menu_cancel:
            mp_btn_save.setVisibility(View.GONE);
            item_edit.setVisible(true);
            item_cancel.setVisible(false);
            onCancelEdit();
            break;
    }
    return super.onOptionsItemSelected(item);
}

补充说明

如果还是需要视图变化的动画效果,找到content_scrolling.xml中包含mp_btn_save的父布局,给它加上android:animateLayoutChanges="true",这样只会在该区域的视图变化时触发动画,不会和CollapsingToolbar的滚动冲突。

内容的提问来源于stack exchange,提问作者Salar Arabpour

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:01:52