2015-07-11 16 views
7

Próbuję zaimplementować Elastyczną przestrzeń ze wzorcem obrazu, używając this tutorial.Zmiana wysokości AppBarLayout programowo w systemie Android

Wszystko działa poprawnie.

Zwróć uwagę na definicję wysokości AppBarLayout, która wynosi 192dp.

Chciałbym ustawić wysokość 1/3 ekranu, aby dopasować this google example for the pattern here.

Oto kod w działalności za onCreate (xml układ jest dokładnie taka sama jak w tutorialu):

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

Ale z jakiegoś powodu, wynik nie jest to, czego oczekuję. W ogóle nie widzę paska aplikacji z tym kodem. (bez kodu wysokość jest zgodna z oczekiwaniami, ale pochodzi z XML i nie może być ustawiona dynamicznie).

Odpowiedz

23

Czy to zamiast:

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

W oryginalnego kodu myślę, że obliczanie ty 1/3 ekranu było źle, ale nadal powinna coś widzieć. Możliwe, że obiekt LayoutParams.MATCH_PARENT w metodzie setLP() nie został poprawnie zaimportowany. Zawsze zadeklaruj najpierw typ widoku, np. CoordinatorLayout.LayoutParams, aby się upewnić. W przeciwnym razie może być łatwo zastosować na przykład Framelayout.LayoutParams.

+0

Czy nie powinno tak być ?: float density = mParentActivity.getResources(). getDisplayMetrics(). density; float heightDp = mParentActivity.getResources(). GetDisplayMetrics(). HeightPixels/density; – David

3

Niektóre metody do zmiany wysokości AppBarLayout programowo z dzielenia, procent lub wagowo wysokości ekranu:

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

Jeśli chcesz postępować zgodnie z wytycznymi projektowania materiałów wysokość powinna być równa domyślnej wysokości Plus przyrost zawartości https://www.google.com/design/spec/layout/structure.html#structure-app-bar

Powiązane problemy