在Android中以编程方式更改AppBarLayout高度

我正在尝试使用本教程来实现具有图像模式的灵活空间。

一切工作正常。

注意AppBarLayout的高度定义是192dp。

我想使屏幕的高度为1/3,以匹配此示例中的谷歌示例 。

以下是活动的onCreate中的代码(布局xml与教程中的完全相同):

AppBarLayout appbar = (AppBarLayout)findViewById(R.id.appbar); float density = getResources().getDisplayMetrics().density; float heightDp = getResources().getDisplayMetrics().heightPixels / density; appbar.setLayoutParams(new CoordinatorLayout.LayoutParams(LayoutParams.MATCH_PARENT, Math.round(heightDp / 3))); 

但由于某种原因,结果不是我所期望的。 这段代码根本看不到应用栏。 (没有代码,高度显示如预期,但它来自XML,不能dynamic设置)。

Solutions Collecting From Web of "在Android中以编程方式更改AppBarLayout高度"

做这个,而不是:

  AppBarLayout appbar = (AppBarLayout) findViewById(R.id.appbar); float heightDp = getResources().getDisplayMetrics().heightPixels / 3; CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams)appbar.getLayoutParams(); lp.height = (int)heightDp; 

在你原来的代码中,我认为你计算三分之一的屏幕是错误的,但你仍然应该看到一些东西。 这可能是setLP()中的LayoutParams.MATCH_PARENT未正确导入。 总是首先声明视图types,即CoordinatorLayout.LayoutParams只是为了确保。 否则,可以很容易地使用一个Framelayout.LayoutParams,例如。

一些方法来改变AppBarLayout的高度编程方式除以屏幕高度的百分比或重量:

 private AppBarLayout appbar; /** * @return AppBarLayout */ @Nullable protected AppBarLayout getAppBar() { if (appbar == null) appbar = (AppBarLayout) findViewById(R.id.appbar); return appbar; } /** * @param divide Set AppBar height to screen height divided by 2->5 */ protected void setAppBarLayoutHeightOfScreenDivide(@IntRange(from = 2, to = 5) int divide) { setAppBarLayoutHeightOfScreenPercent(100 / divide); } /** * @param percent Set AppBar height to 20->50% of screen height */ protected void setAppBarLayoutHeightOfScreenPercent(@IntRange(from = 20, to = 50) int percent) { setAppBarLayoutHeightOfScreenWeight(percent / 100F); } /** * @param weight Set AppBar height to 0.2->0.5 weight of screen height */ protected void setAppBarLayoutHeightOfScreenWeight(@FloatRange(from = 0.2F, to = 0.5F) float weight) { if (getAppBar() != null) { ViewGroup.LayoutParams params = getAppBar().getLayoutParams(); params.height = Math.round(getResources().getDisplayMetrics().heightPixels * weight); getAppBar().setLayoutParams(params); } } 

如果您想遵循材料devise指南,则高度应等于默认高度加内容增量(s) https://www.google.com/design/spec/layout/structure.html#structure-app-bar