Cajón de navegación: ¿Cómo configuro el elemento seleccionado en el inicio?

Mi código funciona perfectamente: cada vez que se hace clic en un elemento de la bandeja de navegación, se selecciona el elemento.

Por supuesto, quiero iniciar la aplicación con un fragmento predeterminado (inicio), pero el cajón de navegación no tiene el elemento seleccionado. ¿Cómo puedo seleccionar ese elemento mediante programación?

public class BaseApp extends AppCompatActivity { //Defining Variables protected String LOGTAG = "LOGDEBUG"; protected Toolbar toolbar; protected NavigationView navigationView; protected DrawerLayout drawerLayout; private DateManager db = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.base_layout); navigationView = (NavigationView) findViewById(R.id.navigation_view); // set the home/dashboard at startup FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); fragmentTransaction.replace(R.id.frame, new DashboardFragment()); fragmentTransaction.commit(); setNavDrawer(); } private void setNavDrawer(){ // Initializing Toolbar and setting it as the actionbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); //Initializing NavigationView //Setting Navigation View Item Selected Listener to handle the item click of the navigation menu navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { // This method will trigger on item Click of navigation menu @Override public boolean onNavigationItemSelected(MenuItem menuItem) { //Checking if the item is in checked state or not, if not make it in checked state // I THINK THAT I NEED EDIT HERE... if (menuItem.isChecked()) menuItem.setChecked(false); else menuItem.setChecked(true); //Closing drawer on item click drawerLayout.closeDrawers(); //Check to see which item was being clicked and perform appropriate action switch (menuItem.getItemId()) { //Replacing the main content with ContentFragment case R.id.home: DashboardFragment dashboardFragment = new DashboardFragment(); FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); fragmentTransaction.replace(R.id.frame, dashboardFragment,"DASHBOARD_FRAGMENT"); fragmentTransaction.commit(); return true; [...] 

Creo que necesito editar aquí:

 if (menuItem.isChecked()) menuItem.setChecked(false); else menuItem.setChecked(true); 

O en onCreate en el inicio de la aplicación con FragmentTransaction.

Gracias por tu apoyo.

Utilice el siguiente código:

 navigationView.getMenu().getItem(0).setChecked(true); 

Llame a este método después de llamar a setNavDrawer();

El getItem(int index) obtiene el MenuItem entonces usted puede llamar a setChecked(true); En ese MenuItem , todo lo que queda por hacer es averiguar qué índice de elementos tiene el valor predeterminado y reemplazar el 0 por ese índice.

Puede seleccionar (resaltar) el elemento llamando

 onNavigationItemSelected(navigationView.getMenu().getItem(0)); 

Aquí hay un enlace de referencia: http://thegeekyland.blogspot.com/2015/11/navigation-drawer-how-set-selected-item.html

EDIT No funcionó en el nexo 4, revisión de la biblioteca de soporte 24.0.0. Recomiendo el uso

navigationView.setCheckedItem(R.id.nav_item);

Contestado por @kingston abajo.

También puede llamar a:

 navigationView.setCheckedItem(id); 

Este método fue introducido en API 23.0.0

Ejemplo

 <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:ignore="UnusedIds"> <group android:id="@+id/group" android:checkableBehavior="single"> <item android:id="@+id/menu_nav_home" android:icon="@drawable/ic_home_black_24dp" android:title="@string/menu_nav_home" /> </group> </menu> 

Nota: android:checkableBehavior="single"

Véase también

Para mí ambos métodos no funcionaron:

  • navigationView.getMenu().getItem(0).setChecked(true);
  • navigationView.setCheckedItem(id);

Prueba este, funciona para mí.

onNavigationItemSelected(navigationView.getMenu().findItem(R.id.nav_profile));

Ejemplo ( NavigationView.OnNavigationItemSelectedListener ):

 private void setFirstItemNavigationView() { navigationView.setCheckedItem(R.id.custom_id); navigationView.getMenu().performIdentifierAction(R.id.custom_id, 0); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setFirstItemNavigationView(); } @SuppressWarnings("StatementWithEmptyBody") @Override public boolean onNavigationItemSelected(MenuItem item) { FragmentManager fragmentManager = getFragmentManager(); switch (item.getItemId()) { case R.id.custom_id: Fragment frag = new CustomFragment(); // update the main content by replacing fragments fragmentManager.beginTransaction() .replace(R.id.viewholder_container, frag) .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN) .addToBackStack(null) .commit(); break; } 

Tks

Siempre hay problemas con Googles "oh tan grandes" libs de soporte. Si desea comprobar un elemento sin degradar su versión de librería de soporte, sólo debe establecer la opción checkable antes de establecer el estado marcado.

 MenuItem item = drawer.getMenu().findItem(R.id.action_something); item.setCheckable(true); item.setChecked(true); 

También podría funcionar si establece checkable en los archivos xml del menú

API 23 proporciona el siguiente método:

 navigationView.setCheckedItem(R.id.nav_item_id); 

Sin embargo, por alguna razón esta función no causó que el código detrás del elemento de navegación se ejecutara. El método ciertamente resalta el elemento en el cajón de navegación, o "lo comprueba", pero no parece llamar al OnNavigationItemSelectedListener resultando en una pantalla en blanco en la puesta en marcha si su pantalla de inicio depende de las selecciones de los cajones de navegación. Es posible llamar manualmente al oyente, pero parece hacky:

 if (savedInstanceState == null) this.onNavigationItemSelected(navigationView.getMenu().getItem(0)); 

El código anterior supone:

  1. Ha implementado NavigationView.OnNavigationItemSelectedListener en su actividad
  2. Ya has llamado:
    navigationView.setNavigationItemSelectedListener(this);
  3. El elemento que desea seleccionar se encuentra en la posición 0

Puede resaltar y seleccionar el elemento con el siguiente 1-liner:

 navigationView.getMenu().performIdentifierAction(R.id.posts, 0); 

Fuente: https://stackoverflow.com/a/31044917/383761

El siguiente código sólo hará que se seleccione el elemento de menú:

navigationView.setCheckedItem(id);

Para seleccionar y abrir el elemento de menú, agregue el siguiente código después de la línea anterior.

onNavigationItemSelected(navigationView.getMenu().getItem(0));

Tienes que llamar a 2 funciones para esto:

Primero: para excutar los comandos que ha implementado en el detector onNavigationItemSelected :

 onNavigationItemSelected(navigationView.getMenu().getItem(R.id.nav_camera)); 

Segundo: para cambiar el estado del elemento de menú del cajón de navegación a seleccionado (o marcado):

 navigationView.setCheckedItem(R.id.nav_camera); 

Llamé a ambas funciones y funcionó para mí.

En primer lugar crear colores para el elemento seleccionado. Aquí https://stackoverflow.com/a/30594875/1462969 buen ejemplo. Le ayuda a cambiar el color del icono. Para cambiar el fondo de todos los elementos seleccionados, agregue en su archivo de valores \ style.xml esto

  <item name="selectableItemBackground">@drawable/selectable_item_background</item> 

Donde selectable_item_background debe declararse en drawable / selectable_item_background.xml

  <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@color/accent_translucent" android:state_pressed="true" /> <item android:drawable="@android:color/transparent" /> </selector> 

Donde el color puede ser declarado en style.xml

  <color name="accent_translucent">#80FFEB3B</color> 

Y después de esto

  // The main navigation menu with user-specific actions mainNavigationMenu_ = (NavigationView) findViewById(R.id.main_drawer); mainNavigationMenu_.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(MenuItem menuItem) { mainNavigationMenu_.getMenu().findItem(itemId).setChecked(true); return true; } }); 

Como veis utilizo este mainNavigationMenu_.getMenu (). FindItem (itemId) .setChecked (true); Para seleccionar el elemento seleccionado. Aquí navigationView

  <android.support.design.widget.NavigationView android:id="@+id/main_drawer" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" app:headerLayout="@layout/header_main_navigation_menu" app:itemIconTint="@color/state_list" app:itemTextColor="@color/primary" app:menu="@menu/main_menu_drawer"/> 

Esta es mi solución, muy simple.

Aquí está mi archivo menu.xml:

 <group android:id="@+id/grp1" android:checkableBehavior="single"> <item android:id="@+id/nav_all_deals" android:checked="true" android:icon="@drawable/ic_all_deals" android:title="@string/all_deals" /> <item android:id="@+id/nav_news_and_events" android:icon="@drawable/ic_news" android:title="@string/news_and_events" /> <item android:id="@+id/nav_histories" android:icon="@drawable/ic_histories" android:title="@string/histories" /> </group> 

El menú anterior resaltará el primer elemento del menú. Debajo de la línea hará algo (por ejemplo: mostrar el primer fragmento, etc). NOTA: escriba después de "configurar el código del cajón"

 onNavigationItemSelected(mNavigationView.getMenu().getItem(0)); 

Por alguna razón es preferible encontrar el MenuItem utilizando los ID's.

 drawer.getMenu().findItem(R.id.action_something).setChecked(true); 

Elija el fragmento que desea al iniciar, por ejemplo. InicioFragmento

  protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //starting Fragment HomeFragment fragment = new HomeFragment(); FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); fragmentTransaction.replace(R.id.frame, fragment); fragmentTransaction.commit(); 
  • Cómo especificar RTL específica drawables
  • ¿Cómo maneja Android los hilos de fondo cuando deja una Actividad?
  • Cajón No se muestra el cajón de navegación de salida
  • Cómo integrar scripts de Python en mi aplicación Android (como SL4A)
  • Proyecto Android: Problema de exportación Lanzamiento cancelado! Proguard devuelto con el código de error 1. Consulte consola
  • Android NavigationDrawer transparencia
  • Esta clase de controlador debe ser estática o pueden producirse fugas: IncomingHandler
  • Fuera de la memoria
  • Cómo agregar un elemento de submenú mediante programación al nuevo diseño de material android support library
  • Toque en cualquier lugar para deslizar el menú abierto para el cajón de navegación
  • Cambio de color de la imagen en el cajón de navegación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.