oreo - Cajón de navegación de Android y windowActionBarOverlay=true
cambiar tamaño de la barra de navegacion android (5)
Y ahora, funciona muy bien para la parte superior, pero por alguna razón también hay un margen en la parte inferior de la vista, lo que no tiene ningún sentido para mí. Aquí hay una captura de pantalla.
Si configura su gravedad ListView para comenzar | inferior , solucionará su problema. No se agrega margen adicional en la parte inferior. Parece que la gravedad predeterminada de DrawerLayout es start | center
<ListView
android:id="@+id/left_drawer"
android:layout_marginTop="?android:attr/actionBarSize"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start|bottom"/>
Estoy intentando implementar el nuevo Cajón de navegación de Android en mi aplicación. He creado un BaseActivity.java que maneja la configuración del cajón y los oyentes, y tengo dos subactividades que extienden esta clase base. En la segunda actividad, planeo usar un estilo de barra de acción diferente, usando los siguientes atributos:
<item name="android:windowActionBarOverlay">true</item>
<item name="android:background">@android:color/transparent</item>
para hacer transparente la barra de acción y enriquecer el contenido, ya que hay un encabezado de imagen en mi diseño.
Logré precisamente eso, pero ahora el problema es que debido a que el contenido se está expandiendo para aprovechar el espacio adicional de uso de la barra de acción como superposición, el cajón de navegación también se está expandiendo y se superpone a la barra de acción, creando una buscando diseño:
Lo que me gustaría haber hecho, es el contenido real (diseño de cuadro que se rellenará con un fragmento) para ocupar el espacio adicional, pero el cajón de navegación aún se encuentra debajo de la barra de acción, similar a la aplicación Play Music:
¿Alguna idea sobre lo que puedo hacer para que eso suceda?
EDITAR Entonces, de acuerdo con la ayuda de Ahmad, puse el marginTop
en el ListView. Aquí está el diseño:
<!-- The navigation drawer -->
<ListView android:id="@+id/left_drawer"
android:layout_marginTop="?android:attr/actionBarSize"
<!-- This was added after seeing the crazy effect, but does nothing -->
android:layout_marginBottom="0dp"
android:layout_marginLeft="0dp"
android:layout_marginRight="0dp"
android:layout_width="240dp"
android:layout_height="fill_parent"
android:layout_gravity="start"
android:choiceMode="singleChoice"
android:background="?attr/listviewBackground"
/>
Y ahora, funciona muy bien para la parte superior, pero por alguna razón también hay un margen en la parte inferior de la vista, lo que no tiene ningún sentido para mí. Aquí hay una captura de pantalla .
No estoy seguro de lo que lo está causando :(
En caso de que alguien esté interesado en otra toma a esta pregunta. Esto es lo que pasó.
Intenté establecer solo el margen en la parte superior de la vista de lista de esta manera:
android:layout_marginTop="?android:attr/actionBarSize"
Pero como se mencionó en la pregunta editada, tuvo un comportamiento extraño en el que también había un margen en la parte inferior a pesar de no estar configurado en el archivo de recursos de diseño.
Entonces, estuve observando detenidamente la aplicación Play Music y noté que no es realmente un margen, sino más bien un relleno, y además, están usando un fondo personalizado que llena el espacio especificado por el relleno con un color transparente.
Esto es lo que hice:
Establecer relleno en la parte superior de la vista de lista, en lugar de margen:
android:paddingTop="?android:attr/actionBarSize"
Como se dijo antes, es importante no codificar las dimensiones, ya que varían según el dispositivo.
- Cree un dibujo personalizable que tenga una parte superior transparente y luego descanse de un color sólido:
De alguna manera se parece a esto:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
<shape android:shape="rectangle">
<solid android:color="#80000000" />
</shape>
</item>
<item android:top="@dimen/action_bar_default_height">
<shape
android:shape="rectangle">
<solid android:color="@color/light_gray" />
</shape>
</item>
Tenga en cuenta que intenté usar ?android:attr/actionBarSize
en el ?android:attr/actionBarSize
, pero eso hizo que la aplicación se cerrara. En su lugar, busqué en grepcode y encontré algunos archivos de dimen con diferentes tamaños para la barra de acción, así que los agregué a los archivos de dimen de mi propio proyecto.
- Para valores: 48dp.
- Para valores-tierra: 40dp
- Para los valores-sw600dp: 56dp
Y después de eso, creo que me veo muy bien, note en la captura de pantalla que la vista de lista y la barra de acción no se superponen, y que la parte transparente de la vista de lista es del tamaño correcto.
Espero que ayude a cualquiera que se esté preguntando cómo lograr esto.
He creado una demostración de trabajo siguiendo la guía anterior y probada en 2.x a 5.x
Puedes clonar desde Github
Lo importante para jugar es en la Actividad Principal.
toolbar = (Toolbar) findViewById(R.id.toolbar);
res = this.getResources();
this.setSupportActionBar(toolbar);
ActionBar actionBar = getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
{
ScrimInsetsFrameLayout scrimInsetsFrameLayout = (ScrimInsetsFrameLayout)
findViewById(R.id.linearLayout);
scrimInsetsFrameLayout.setOnInsetsCallback(this);
}
y la llamada de vuelta
@Override
public void onInsetsChanged(Rect insets) {
Toolbar toolbar = this.toolbar;
ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams)
toolbar.getLayoutParams();
lp.topMargin = insets.top;
int top = insets.top;
insets.top += toolbar.getHeight();
toolbar.setLayoutParams(lp);
insets.top = top; // revert
}
Absolutamente el tema para V21 hace la magia.
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- API 21 theme customizations can go here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/accent_material_light</item>
<item name="windowActionModeOverlay">true</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:windowTranslucentStatus">true</item>
</style>
Puede establecer un margen en la parte superior de su diseño, de modo que el contenido se dibuje debajo de la barra de acción.
Solo agrega esto en tu diseño principal:
android:layout_marginTop="?android:attr/actionBarSize"
El atributo actionBarSize
refiere, como ya ActionBar
adivinado, al tamaño de la ActionBar
. No puede establecer un valor absoluto como margen, ya que la ActionBar
no siempre tiene el mismo tamaño en todos los dispositivos Android (es más grande en tabletas, más pequeño en dispositivos de teléfono).
Editar:
Establezca el margen en el ListView
.
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<ListView
android:id="@+id/left_drawer"
android:layout_marginTop="?android:attr/actionBarSize"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"/>
</android.support.v4.widget.DrawerLayout>
La aplicación Google Music hace lo mismo:
Resolví este problema usando paddingTop :
<FrameLayout
android:id="@+id/menu_frame"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:paddingTop="?attr/actionBarSize" >
<ListView
android:id="@+id/left_drawer_list"
android:layout_width="240dp"
android:layout_height="match_parent" />
</FrameLayout>
Espero que ayude