web-dev-qa-db-ja.com

プログラムでAppBarLayoutの高さをAndroid

このチュートリアル を使用して、画像パターンでフレキシブルスペースを実装しようとしています。

すべてが正常に動作します。

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からのものであり、動的に設定することはできません)。

9
Jjang

代わりにこれを行ってください:

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

元のコードでは、画面の3分の1の計算が間違っていたと思いますが、それでも何かが表示されているはずです。 setLP()のLayoutParams.MATCH_PARENTが正しくインポートされなかった可能性があります。念のため、常に最初にビュータイプ、つまりCoordinatorLayout.LayoutParamsを宣言してください。それ以外の場合は、たとえばFramelayout.LayoutParamsを簡単に使用できます。

24

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);
    }
}

マテリアルデザインのガイドラインに従う場合、高さはデフォルトの高さにコンテンツの増分を加えたものに等しくする必要があります https://www.google.com/design/spec/layout/structure.html#structure- app-bar

3
TouchBoarder