studio pantalla oreo modo inmersivo immersive con completa activar java android android-actionbar sidebar navigation-drawer

java - oreo - Cajón de navegación en Android no es pantalla completa



pantalla completa android 8 (6)

La mejor solución para usted es crear un cajón de navegación personalizado. Entiendo que no desea utilizar un tercero, pero esta puede ser una solución rápida para su problema. Sliding Menu Lib link .

Desde que Google introdujo el cajón de navegación, traté de usar este componente para crear un menú similar al de Facebook. El problema es que el efecto visual parece ser diferente.

El de Google tiene la barra de acción retener cuando el cajón está abierto, mientras que el de Facebook no. En su lugar, toda la pantalla se ha desplazado hacia el lado derecho

He encontrado que hay algunas posibilidades para lograr esto, pero como prefiero no incluir lib de terceros en el proyecto, ¿hay alguna forma de lograrlo? Gracias

Código basado en el tutorial del cajón de navegación

protected void setupMenu(List<String> list, final ListView menu) { Adapter customAdapter = new Adapter(getActionBar().getThemedContext(), R.layout.item, list); menu.setAdapter(customAdapter); menu.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, final int pos, long id) { String selected = ((TextView) view.findViewById(R.id.itemTxt)) .getText().toString(); // define pass data final Bundle bData = new Bundle(); bData.putString("itemSelect", selected); drawer.setDrawerListener(new DrawerLayout.SimpleDrawerListener() { @Override public void onDrawerClosed(View drawerView) { super.onDrawerClosed(drawerView); FragmentTransaction tx = getSupportFragmentManager() .beginTransaction(); tx.replace(R.id.mainContent, Fragment.instantiate( MainActivity.this, "com.example.utilities.ContentPage", bData)); tx.commit(); } }); drawer.closeDrawer(menu); } }); }


Si revisas el código fuente de DrawerLayout, verás, que resposnible para este margen mínimo es la variable mMinDrawerMargin

Entonces, hay al menos 2 soluciones (trucos) 1. extienda DrawerLayout y establezca esta variable en 0 con reflexión. llama a este método desde todos los constructores.

private void init() { try { Field declaredField = getClass().getSuperclass().getDeclaredField("mMinDrawerMargin"); declaredField.setAccessible(true); declaredField.setInt(declaredField, 0); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } }

  1. no tan complicado

método overryde onMeasure como este

@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // taken from parents logic float density = this.getResources().getDisplayMetrics().density; int minMargin = (int) (64.0F * density + 0.5F); int widthMode = MeasureSpec.getMode(widthMeasureSpec); int widthSize = MeasureSpec.getSize(widthMeasureSpec); int newWidth = MeasureSpec.makeMeasureSpec(widthSize + minMargin, widthMode); super.onMeasure(newWidth, heightMeasureSpec); }

También creé un proyecto de muestra aquí https://bitbucket.org/wnc_21/fsnavigationdrawer


este problema es causado por el margen, por lo que debemos restablecer el ancho: resolví este problema implementando DrawerListener y ajustando ListView dentro de LinearLayout para crear salas para otras vistas al lado de la vista de lista

aquí está mi oyente

public class NavigationDrawer implements DrawerLayout.DrawerListener { private DrawerLayout mDrawerLayout; protected boolean expanded = false; NavigationDrawer(Activity activity) { this.activity = activity; } public NavigationDrawer bindDrawerLayout(int id) { mDrawerLayout = (DrawerLayout) activity.findViewById(id); mDrawerLayout.setDrawerListener(this); return this; } @Override public void onDrawerSlide(View drawerView, float slideOffset) { if (!expanded) { Log.i("margin", "here we are"); LinearLayout layout = (LinearLayout) findViewById(R.id.left_drawer); layout.getLayoutParams().width = getResources().getDisplayMetrics().widthPixels; layout.requestLayout(); expanded = true; } } @Override public void onDrawerOpened(View drawerView) { } @Override public void onDrawerClosed(View drawerView) { } @Override public void onDrawerStateChanged(int newState) { } }

aquí está mi diseño:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/application_drawer_layout" android:layout_width="fill_parent" android:layout_height="match_parent" android:background="#ffffff"> <FrameLayout android:id="@+id/application_content_frame" android:layout_width="match_parent" android:layout_height="match_parent" /> <LinearLayout android:id="@+id/left_drawer" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_gravity="start" android:background="#000000" android:orientation="vertical"> <ListView android:id="@+id/application_left_drawer" android:layout_width="fill_parent" android:layout_height="match_parent" android:layout_gravity="start" android:background="#111" android:choiceMode="singleChoice" android:divider="@android:color/transparent" android:dividerHeight="0dp" /> </LinearLayout> </android.support.v4.widget.DrawerLayout>


Aquí hay una solución rápida que funcionó para mí:

<include android:id="@+id/left_drawer" android:orientation="vertical" **android:layout_width="320dp"** android:layout_height="match_parent" android:layout_gravity="start" layout="@layout/drawer"/>

Establecer el ancho del diseño incluido. Para dispositivos con diferentes tamaños de pantalla, puede establecer dinámicamente el ancho de este diseño incluido.

Todo lo mejor !!!!


Si desea implementar el menú deslizante de Facebook, use androids SlidingPaneLayout en lugar de NavigationDrawer.

<android.support.v4.widget.SlidingPaneLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:layout_width="250dp" android:layout_height="match_parent" android:background="#CC00FF00" /> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="match_parent" android:background="#CC0000FF" > // add toolbar and other required layouts </LinearLayout> </android.support.v4.widget.SlidingPaneLayout>

agregue la barra de herramientas en lugar de la barra de acciones y no aplique ningún tema de la barra de acciones.


Espero que esto ayude.

<android.support.design.widget.NavigationView android:id="@+id/nav_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" android:fitsSystemWindows="true" > <include layout="@layout/nav_header_main" android:layout_width="match_parent" android:layout_height="match_parent" /> </android.support.design.widget.NavigationView>

Eliminar las dos últimas líneas en el código predeterminado

app:headerLayout="@layout/nav_header_main" app:menu="@menu/activity_main_drawer"