在 Android 中以编程方式更改 AppBarLayout 高度
Change AppBarLayout height programmatically in Android
我正在尝试使用 this tutorial.
实现具有图像模式的灵活 Space
一切正常。
注意 AppBarLayout 的高度定义是 192dp。
我想将高度改为屏幕的 1/3,以匹配 this google example for the pattern here。
这是activity的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,无法动态设置)。
改为这样做:
AppBarLayout appbar = (AppBarLayout) findViewById(R.id.appbar);
float heightDp = getResources().getDisplayMetrics().heightPixels / 3;
CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams)appbar.getLayoutParams();
lp.height = (int)heightDp;
在你的原始代码中,我认为你对屏幕的 1/3 的计算是错误的,但你仍然应该看到一些东西。可能是 setLP() 中的 LayoutParams.MATCH_PARENT 没有正确导入。始终首先声明视图类型,即 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);
}
}
如果您想遵循 material 设计指南,高度应等于默认高度加上内容增量
https://www.google.com/design/spec/layout/structure.html#structure-app-bar
我正在尝试使用 this tutorial.
实现具有图像模式的灵活 Space一切正常。
注意 AppBarLayout 的高度定义是 192dp。
我想将高度改为屏幕的 1/3,以匹配 this google example for the pattern here。
这是activity的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,无法动态设置)。
改为这样做:
AppBarLayout appbar = (AppBarLayout) findViewById(R.id.appbar);
float heightDp = getResources().getDisplayMetrics().heightPixels / 3;
CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams)appbar.getLayoutParams();
lp.height = (int)heightDp;
在你的原始代码中,我认为你对屏幕的 1/3 的计算是错误的,但你仍然应该看到一些东西。可能是 setLP() 中的 LayoutParams.MATCH_PARENT 没有正确导入。始终首先声明视图类型,即 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);
}
}
如果您想遵循 material 设计指南,高度应等于默认高度加上内容增量 https://www.google.com/design/spec/layout/structure.html#structure-app-bar