java 在 Android 中以编程方式更改 AppBarLayout 高度
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/31362438/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Change AppBarLayout height programmatically in Android
提问by Jjang
I'm trying to implement Flexible Space with image pattern, using this tutorial.
我正在尝试使用本教程实现具有图像模式的灵活空间。
Everything works fine.
一切正常。
Notice the height definition of the AppBarLayout which is 192dp.
注意 AppBarLayout 的高度定义是 192dp。
I'd like to make the height 1/3 of the screen instead, to match this google example for the pattern here.
我想让屏幕的高度为 1/3,以匹配此 google 示例此处的模式。
Here's the code in the activity's onCreate (the layout xml is exactly the same as in the tutorial):
下面是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)));
But for some reason, the result is not what I'm expecting. I can't see the app bar at all with this code. (without the code, the height shows as expected but it's from XML and can't be set dynamically).
但出于某种原因,结果并不是我所期望的。使用此代码我根本看不到应用栏。(没有代码,高度按预期显示,但它来自 XML,不能动态设置)。
回答by Brett Nottingham
Do this instead:
改为这样做:
AppBarLayout appbar = (AppBarLayout) findViewById(R.id.appbar);
float heightDp = getResources().getDisplayMetrics().heightPixels / 3;
CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams)appbar.getLayoutParams();
lp.height = (int)heightDp;
In your original code I think that you calculation for 1/3 of the screen was wrong, but you still should have seen something. It could be that the LayoutParams.MATCH_PARENT in the setLP() wasn't imported correctly. Always declare the view type first, i.e. CoordinatorLayout.LayoutParams just to make sure. Otherwise it can be easy to use a Framelayout.LayoutParams, for instance.
在您的原始代码中,我认为您对屏幕 1/3 的计算是错误的,但您仍然应该看到一些东西。可能是 setLP() 中的 LayoutParams.MATCH_PARENT 未正确导入。总是首先声明视图类型,即 CoordinatorLayout.LayoutParams 只是为了确保。否则,例如使用 Framelayout.LayoutParams 会很容易。
回答by TouchBoarder
Some methods for changing the AppBarLayout height programatically with dividing, percent or by weight of the screen height:
通过屏幕高度的除法、百分比或重量以编程方式更改 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);
}
}
If you want to follow the material design guidelines the height should be equal to the default height plus content increment(s) https://www.google.com/design/spec/layout/structure.html#structure-app-bar
如果您想遵循材料设计指南,高度应等于默认高度加上内容增量 https://www.google.com/design/spec/layout/structure.html#structure-app-bar