点击选项菜单时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
相关产品推荐
相关产品推荐

