2015-07-11 7 views
7

Ich versuche, Flexible Space mit Bildmuster zu implementieren, mit this tutorial.AppBarLayout Höhe programmatisch in Android ändern

Alles funktioniert gut.

Beachten Sie die Höhe Definition der AppBarLayout, die 192dp ist.

Ich möchte stattdessen die Höhe 1/3 des Bildschirms, um this google example for the pattern here entsprechen.

Hier ist der Code in der onCreate Aktivität (das Layout xml ist genau die gleiche wie im 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))); 

Aber aus irgendeinem Grunde, das Ergebnis ist nicht das, was ich erwarte. Ich kann die App-Leiste mit diesem Code überhaupt nicht sehen. (Ohne den Code wird die Höhe wie erwartet angezeigt, aber sie stammt aus XML und kann nicht dynamisch festgelegt werden).

Antwort

23

Tun Sie dies statt:

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 Ihrem ursprünglichen Code denke ich, dass Sie die Berechnung für 1/3 des Bildschirms nicht in Ordnung war, aber Sie sollten noch etwas gesehen haben. Es könnte sein, dass der LayoutParams.MATCH_PARENT in der setLP() nicht korrekt importiert wurde. Deklarieren Sie immer zuerst den Ansichtstyp, d. H. CoordinatorLayout.LayoutParams, um sicherzugehen. Andernfalls kann es beispielsweise einfach sein, ein Framelayout.LayoutParams zu verwenden. Einige Methoden

+0

Sollte das nicht so sein ?: float density = mParentActivity.getResources(). getDisplayMetrics(). dichte; float heightDp = mParentActivity.getResources(). GetDisplayMetrics(). HeightPixels/Dichte; – David

3

zum Ändern der AppBarLayout Höhe programmatisch mit Teilung, Prozent oder Gewicht der Bildschirmhöhe:

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

Wenn Sie das Material Design-Richtlinien die Höhe auf die Standardhöhe gleich sein sollte folgen wollen und content increment (s) https://www.google.com/design/spec/layout/structure.html#structure-app-bar