11

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.

I'd like to make the height 1/3 of the screen instead, to match this google example for the pattern here.

Here's the code in the activity's onCreate (the layout xml is exactly the same as in the tutorial):

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).

Cœur
  • 37,241
  • 25
  • 195
  • 267
Jjang
  • 11,250
  • 11
  • 51
  • 87

2 Answers2

28

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.

  • Shouldn't it be like this?: float density = mParentActivity.getResources().getDisplayMetrics().density; float heightDp = mParentActivity.getResources().getDisplayMetrics().heightPixels / density; – David Sep 28 '17 at 08:33
3

Some methods for changing the AppBarLayout height programatically with dividing, percent or by weight of the screen height:

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

TouchBoarder
  • 6,422
  • 2
  • 52
  • 60