Cambiar la altura de AppBarLayout por programa en Android

Estoy intentando implementar el espacio flexible con el patrón de la imagen, usando este tutorial .

Todo funciona bien.

Observe la definición de altura de AppBarLayout que es 192dp.

Me gustaría hacer la altura 1/3 de la pantalla en lugar, para que coincida con este ejemplo de google para el patrón aquí .

Aquí está el código en la actividad onCreate (el layout xml es exactamente el mismo que en el 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))); 

Pero por alguna razón, el resultado no es lo que estoy esperando. No puedo ver la barra de aplicaciones en absoluto con este código. (Sin el código, la altura se muestra como se espera, pero es de XML y no se puede establecer dinámicamente).

Haga esto en su lugar:

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

En su código original creo que el cálculo de 1/3 de la pantalla estaba mal, pero aún así debería haber visto algo. Podría ser que LayoutParams.MATCH_PARENT en el setLP () no se haya importado correctamente. Siempre declare el tipo de vista primero, es decir CoordinatorLayout.LayoutParams sólo para asegurarse. De lo contrario, puede ser fácil de usar un Framelayout.LayoutParams, por ejemplo.

Algunos métodos para cambiar la altura de AppBarLayout de forma programática con la división, el porcentaje o el peso de la altura de la pantalla:

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

Si desea seguir las directrices de diseño del material, la altura debe ser igual a la altura predeterminada más los incrementos de contenido https://www.google.com/design/spec/layout/structure.html#structure-app-bar

  • El estilo AutoCompleteTextView con AppCompat.EditText no funciona
  • ¿Hay una biblioteca de diseño / overlay / showcase de Android Material Design onboarding / tutorial?
  • Android: establecer la elevación para el elemento anterior (sombra con dirección hacia arriba)
  • Fuente personalizada para el mensaje de error de TextInputLayout en android
  • ¿Es posible cambiar el color del icono de diseño de material de xml en Android?
  • ¿Cómo puedo crear un widget de interfaz de usuario de diseño de material de Android?
  • ¿Cómo puedo desactivar el valor alfa de Android Lollipop ripple?
  • Cómo utilizar TabLayout con la barra de herramientas dentro de CollapsingToolbarLayout?
  • ImageViews en LinearLayout redondeado
  • CoordinatorLayout no dibuja detrás de la barra de estado incluso con windowTranslucentStatus y fitsSystemWindows
  • Contactos con categorías: grupos, favoritos y alfabetos
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.