2015-07-11 19 views
7

Sto tentando di implementare Spazio flessibile con pattern di immagine, utilizzando this tutorial.Modificare l'altezza di AppBarLayout in modo programmatico su Android

Tutto funziona correttamente.

Notare la definizione di altezza di AppBarLayout che è 192dp.

Vorrei aumentare l'altezza di 1/3 dello schermo, in modo che corrisponda a this google example for the pattern here.

Ecco il codice nel onCreate della propria attività (XML layout è esattamente lo stesso che nel 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))); 

Ma per qualche ragione, il risultato non è quello che mi aspetto. Non riesco a vedere la barra delle applicazioni con questo codice. (senza il codice, l'altezza viene visualizzata come previsto ma proviene da XML e non può essere impostata dinamicamente).

risposta

23

fare questo, invece:

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

Nel codice originale Penso che il calcolo per 1/3 dello schermo era sbagliato, ma è comunque dovuto vedere qualcosa. Potrebbe essere che LayoutParams.MATCH_PARENT in setLP() non sia stato importato correttamente. Dichiara sempre il tipo di vista per primo, cioè CoordinatorLayout.LayoutParams solo per essere sicuro. Altrimenti può essere facile usare un Framelayout.LayoutParams, per esempio.

+0

Non dovrebbe essere così ?: float density = mParentActivity.getResources(). getDisplayMetrics(). density; float heightDp = mParentActivity.getResources(). GetDisplayMetrics(). HeightPixels/density; – David

3

Alcuni metodi per modificare l'altezza AppBarLayout programatically con dividendo, cento o, in peso, dell'altezza dello schermo:

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

Se si vuole seguire le linee guida del materiale di progettazione l'altezza dovrebbe essere uguale all'altezza di default più incremento/i di contenuto https://www.google.com/design/spec/layout/structure.html#structure-app-bar