studio onnavigationitemselected ejemplo crear como android navigation-drawer drawerlayout

android - onnavigationitemselected - DrawerLayout Double Drawer(Cajones izquierdo y derecho simultáneamente)



navigationview android (7)

Tengo una aplicación en la que quiero implementar un doble cajón: uno de la izquierda y otro de la derecha. El cajón izquierdo es para la navegación de la aplicación, el cajón derecho es para el filtrado de resultados.

Entonces, el diseño es así:

<?xml version="1.0" encoding="utf-8"?> <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"> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/light_grey" android:orientation="vertical"> <GridView android:id="@+id/gridview" style="@style/GridViewStyle" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center" android:horizontalSpacing="7dp" android:stretchMode="columnWidth" android:verticalSpacing="7dp" /> </LinearLayout> <ListView android:id="@+id/left_drawer" android:layout_width="240dp" android:layout_height="match_parent" android:layout_gravity="start" android:background="#111" android:choiceMode="singleChoice" android:divider="@android:color/transparent" android:dividerHeight="0dp" /> <ListView android:id="@+id/right_drawer" android:layout_width="240dp" android:layout_height="match_parent" android:layout_gravity="end" android:background="#111" android:choiceMode="singleChoice" android:divider="@android:color/transparent" android:dividerHeight="0dp" /> </android.support.v4.widget.DrawerLayout>

Puedes ver claramente aquí "left_drawer" y "right_drawer", y su gravedad respectiva - "start" y "end" ¡Y esto realmente funciona! Puedes sacarlos a los dos.

El problema es que cuando implemente el DrawerToggle, solo abre el cajón izquierdo y no cierra el que está a la derecha, así que si se abre el cajón derecho y presiono el botón DrawerToggle, los cajones izquierdos también se abren y se superpone al cajón derecho. .

Hay un par de soluciones que trato de obtener:

  1. Haga el mismo botón de CajónTaggle en el lado derecho, con el mismo comportamiento y animación que el lado izquierdo.
  2. Haga el cajón en el lado opuesto del cajón que estoy tratando de abrir, se cierra automáticamente (si el cajón izquierdo está abierto y presiono la palanca del cajón derecho y viceversa).

Y no he pensado cómo hacerlo, porque DrawerToggle acepta el DrawerLayout como un parámetro, y no los cajones individuales ...

Estoy usando la Biblioteca de soporte.

¿Alguien tiene alguna idea? Gracias de antemano.


Aquí está el código para una actividad de doble cajón que puede ampliarse con otras actividades para implementar el doble cajón, suponiendo que tengan un diseño como el propuesto por OP.

public class DoubleDrawerActivity extends ActionBarActivity { private DrawerLayout mDrawerLayout; private ActionBarDrawerToggle mDrawerToggle; private View mLeftDrawerView; private View mRightDrawerView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); } @Override protected void onStart() { super.onStart(); if(mDrawerLayout == null || mLeftDrawerView == null || mRightDrawerView == null || mDrawerToggle == null) { // Configure navigation drawer mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); mLeftDrawerView = findViewById(R.id.left_drawer); mRightDrawerView = findViewById(R.id.right_drawer); mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.drawable.ic_navigation_drawer, R.string.drawer_open, R.string.drawer_close) { /** Called when a drawer has settled in a completely closed state. */ public void onDrawerClosed(View drawerView) { if(drawerView.equals(mLeftDrawerView)) { getSupportActionBar().setTitle(getTitle()); supportInvalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() mDrawerToggle.syncState(); } } /** Called when a drawer has settled in a completely open state. */ public void onDrawerOpened(View drawerView) { if(drawerView.equals(mLeftDrawerView)) { getSupportActionBar().setTitle(getString(R.string.app_name)); supportInvalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() mDrawerToggle.syncState(); } } @Override public void onDrawerSlide(View drawerView, float slideOffset) { // Avoid normal indicator glyph behaviour. This is to avoid glyph movement when opening the right drawer //super.onDrawerSlide(drawerView, slideOffset); } }; mDrawerLayout.setDrawerListener(mDrawerToggle); // Set the drawer toggle as the DrawerListener } } @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); // Sync the toggle state after onRestoreInstanceState has occurred. mDrawerToggle.syncState(); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); mDrawerToggle.onConfigurationChanged(newConfig); } @Override public boolean onPrepareOptionsMenu(Menu menu) { // If the nav drawer is open, hide action items related to the content view for(int i = 0; i< menu.size(); i++) menu.getItem(i).setVisible(!mDrawerLayout.isDrawerOpen(mLeftDrawerView)); return super.onPrepareOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()) { case android.R.id.home: mDrawerToggle.onOptionsItemSelected(item); if(mDrawerLayout.isDrawerOpen(mRightDrawerView)) mDrawerLayout.closeDrawer(mRightDrawerView); return true; } return super.onOptionsItemSelected(item); } }


Aquí está mi pequeña solución para todos los que quieran evitar la animación del indicador del cajón si deslizan la vista correcta. Simplemente implemente el método onDrawerSlide de esta manera.

mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.drawable.ic_drawer_white, 0, 0) { @Override public void onDrawerClosed(View view) { invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() } @Override public void onDrawerOpened(View drawerView) { invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() } @Override public void onDrawerSlide(View drawerView, float slideOffset) { if (drawerView == mSlidingMenuNavigationList) { super.onDrawerSlide(drawerView, slideOffset); } else { // do nothing on all other views } } };


He resuelto agregar este código en el método onOptionsItemSelected:

switch (item.getItemId()) { case android.R.id.home: if (mDrawerLayout.isDrawerOpen(mDrawerList_right)){ mDrawerLayout.closeDrawer(mDrawerList_right); } mDrawerLayout.openDrawer(mDrawerList_left); } break; case R.id.action_drawer: if (mDrawerLayout.isDrawerOpen(mDrawerList_left)){ mDrawerLayout.closeDrawer(mDrawerList_left); } mDrawerLayout.openDrawer(mDrawerList_right); } default: break; }

He agregado un botón de acción y he anulado el botón de inicio de la barra de acciones


Puede llamarlo así en el controlador de ToggleButton, por ejemplo:

mDrawerLayout.openDrawer(mDrawer); mDrawerLayout.closeDrawer(mDrawer);

Donde mDrawer es una referencia al cajón específico que necesita abrir (ya sea una vista o un diseño), en su caso, el ListView real que desea mostrar.


Puede usar NavigationView desde el diseño del material.

<?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:openDrawer="start"> <include layout="@layout/app_bar_main" android:layout_width="match_parent" android:layout_height="match_parent" /> <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" app:headerLayout="@layout/nav_header_main" app:menu="@menu/activity_main_drawer" /> <android.support.design.widget.NavigationView android:id="@+id/nav_view2" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="end" android:fitsSystemWindows="true" app:headerLayout="@layout/nav_header_main" app:menu="@menu/activity_main_drawer1" /> </android.support.v4.widget.DrawerLayout>

para obtener más información, consulte http://v4all123.blogspot.in/2016/03/simple-example-of-navigation-view-on.html


Utilice la constante de gravedad (Gravedad.LEFT o Gravedad.RIGHT) del cajón que desee cerrar (al abrir el otro) en onPastionsSelect () como se muestra a continuación.

public boolean onOptionsItemSelected(MenuItem item) { if (mDrawerToggle.onOptionsItemSelected(item)) { // Close the right side drawer if visible if(mDrawerLayout.isDrawerVisible(Gravity.RIGHT)) { mDrawerLayout.closeDrawer(Gravity.RIGHT); } return true; } // Regular stuff switch (item.getItemId()) { case R.id.action_example: Toast.makeText(getActivity(), "Example action.", Toast.LENGTH_SHORT).show(); return true; } return super.onOptionsItemSelected(item); }

mDrawerToggle = Objeto de escucha implementando DrawerLayout.DrawerListener
Ver: http://developer.android.com/reference/android/support/v4/app/ActionBarDrawerToggle.html


hacer un artículo personalizado y agregarlo a la derecha, pasarle el cajón derecho.

final ToggleButton ic_nav = (ToggleButton) customNav.findViewById(R.id.ic_nav); ic_nav.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { if ( mDrawerLayout.isDrawerOpen(mDrawerList) && arg0.isSelected()) { mDrawerLayout.closeDrawer(mDrawerList); arg0.setSelected(false); } else if (!mDrawerLayout.isDrawerOpen(mDrawerList) && !arg0.isSelected()){ mDrawerLayout.openDrawer(mDrawerList); ic_nav.setSelected(false); arg0.setSelected(true); } } });