含大图头部的CollapsingToolbarLayout如何设置起始高度(SDK26)
解决方案:设置CollapsingToolbarLayout的起始(展开)高度
我之前在SDK26环境下踩过类似的坑,给你几个亲测有效的方案:
方案一:静态布局直接指定固定高度
最简单的方式就是直接给CollapsingToolbarLayout设置固定的layout_height,比如你想要起始高度为300dp:
<android.support.design.widget.CollapsingToolbarLayout android:id="@+id/collapsing_toolbar" android:layout_width="match_parent" android:layout_height="300dp" <!-- 这里直接设置起始高度 --> android:fitsSystemWindows="true" app:contentScrim="?attr/colorPrimary" app:expandedTitleMarginEnd="64dp" app:expandedTitleMarginStart="16dp" app:layout_scrollFlags="scroll|exitUntilCollapsed">
同时记得把内部的ImageView高度设为match_parent,加上app:layout_collapseMode="parallax"实现视差效果,这样图片就能撑满整个起始高度。
方案二:动态计算适配屏幕高度
如果需要根据屏幕尺寸动态调整(比如占屏幕高度的1/3),可以在代码里计算后设置:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 获取屏幕总高度 DisplayMetrics displayMetrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); int screenHeight = displayMetrics.heightPixels; // 减去状态栏高度(如果开了fitsSystemWindows) int statusBarHeight = 0; int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { statusBarHeight = getResources().getDimensionPixelSize(resourceId); } // 计算起始高度(比如屏幕可用高度的1/3) int startHeight = (screenHeight - statusBarHeight) / 3; // 给CollapsingToolbarLayout设置高度 CollapsingToolbarLayout collapsingToolbar = findViewById(R.id.collapsing_toolbar); ViewGroup.LayoutParams params = collapsingToolbar.getLayoutParams(); params.height = startHeight; collapsingToolbar.setLayoutParams(params); }
方案三:通过AppBarLayout间接控制
因为CollapsingToolbarLayout嵌套在AppBarLayout里,也可以给AppBarLayout设置固定高度,让子布局匹配:
<android.support.design.widget.AppBarLayout android:id="@+id/appbar" android:layout_width="match_parent" android:layout_height="300dp" <!-- 控制AppBar整体高度 --> android:fitsSystemWindows="true" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> <android.support.design.widget.CollapsingToolbarLayout android:id="@+id/collapsing_toolbar" android:layout_width="match_parent" android:layout_height="match_parent" <!-- 匹配AppBar高度 --> android:fitsSystemWindows="true" app:contentScrim="?attr/colorPrimary" app:expandedTitleMarginEnd="64dp" app:expandedTitleMarginStart="16dp" app:layout_scrollFlags="scroll|exitUntilCollapsed"> <!-- 内部ImageView和Toolbar --> </android.support.design.widget.CollapsingToolbarLayout> </android.support.design.widget.AppBarLayout>
这种方式适合需要统一控制整个AppBar区域高度的场景。
关键注意点
- 一定要确保
CollapsingToolbarLayout里有一个设置了app:layout_collapseMode="pin"的Toolbar,否则折叠后顶部会没有导航栏。 - 如果用网络图片,记得给ImageView设置
scaleType="centerCrop",避免图片加载后打乱布局高度。 - SDK26下不需要额外兼容处理,以上方案都能正常运行。
内容的提问来源于stack exchange,提问作者hemi_p
相关产品推荐
相关产品推荐

