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

Java 在Android中以编程方式更改AppBarLayout高度,java,android,android-5.0-lollipop,material-design,appbar,Java,Android,Android 5.0 Lollipop,Material Design,Appbar,我正在尝试使用图像模式实现灵活的空间 一切正常 请注意AppBarLayout的高度定义为192dp 我想将屏幕的高度改为1/3,以便匹配 以下是活动的onCreate中的代码(布局xml与教程中的完全相同): 但由于某些原因,结果并不是我所期望的。使用此代码,我根本看不到应用程序栏。(如果没有代码,高度将按预期显示,但它来自XML,无法动态设置)。请执行以下操作: AppBarLayout appbar = (AppBarLayout) findViewById(R.id.appbar

我正在尝试使用图像模式实现灵活的空间

一切正常

请注意AppBarLayout的高度定义为192dp

我想将屏幕的高度改为1/3,以便匹配

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

但由于某些原因,结果并不是我所期望的。使用此代码,我根本看不到应用程序栏。(如果没有代码,高度将按预期显示,但它来自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_父项未正确导入。始终首先声明视图类型,即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);
    }
}
如果要遵循材质设计准则,高度应等于默认高度加上内容增量

应该是这样吗?:float density=mParentActivity.getResources().getDisplayMetrics().density;float heightDp=mParentActivity.getResources().getDisplayMetrics().heightPixels/density;
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);
    }
}