Cajón de navegación: ¿cómo configuro el elemento seleccionado al inicio?

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

Por supuesto, quiero iniciar la aplicación con un fragmento predeterminado (inicio), pero Navigation Drawer no tiene el elemento seleccionado. ¿Cómo puedo seleccionar ese elemento programáticamente?

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 al inicio de la aplicación con FragmentTransaction.

Gracias por tu apoyo.

Usa 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 luego puede llamar a setChecked(true); en ese MenuItem , todo lo que queda por hacer es averiguar qué índice de elemento tiene el valor predeterminado, y reemplazar el 0 con 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

EDITAR No funcionó en nexus 4, admite la revisión de la biblioteca 24.0.0. Recomiendo usar

navigationView.setCheckedItem(R.id.nav_item);

respondido por @kingston a continuación.

También puedes llamar:

 navigationView.setCheckedItem(id); 

Este método fue introducido en API 23.0.0

Ejemplo

 < ?xml version="1.0" encoding="utf-8"?>      

Nota: android:checkableBehavior="single"

Ver también esto

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 las libs de soporte de Google “oh tan grandes”. Si desea verificar un elemento sin degradar su versión de libs de soporte, simplemente configure la opción de verificación antes de configurar el estado verificado.

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

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

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

API 23 proporciona el siguiente método:

 navigationView.setCheckedItem(R.id.nav_item_id); 

Sin embargo, por alguna razón, esta función no hizo que se ejecutara el código detrás del elemento de navegación. El método sin duda resalta el elemento en el cajón de navegación, o ‘lo comprueba’, pero no parece llamar al OnNavigationItemSelectedListener lo que OnNavigationItemSelectedListener resultado una pantalla en blanco al inicio si la pantalla de inicio depende de las selecciones del cajón 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 asume:

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

Tienes que llamar a 2 funciones para esto:

Primero: para desactivar los comandos que ha implementado en onNavigationItemSelected listener:

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

Segundo: para cambiar el estado del elemento del 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í.

El siguiente código solo seleccionará el elemento de menú:

navigationView.setCheckedItem(id);

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

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

En primer lugar, crea colores para el elemento seleccionado. Aquí https://stackoverflow.com/a/30594875/1462969 buen ejemplo. Te ayuda a cambiar el color del ícono. Para cambiar el fondo de todo el elemento seleccionado, agregue en su archivo values ​​\ style.xml esto

  @drawable/selectable_item_background 

Donde seleccionatable_item_background debe declararse en drawable / seleccionable_item_background.xml

  < ?xml version="1.0" encoding="utf-8"?>     

Donde el color se puede declarar en style.xml

  #80FFEB3B 

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 ve, utilicé este mainNavigationMenu_.getMenu (). FindItem (itemId) .setChecked (true); para establecer el elemento seleccionado. Aquí navigationView

   

Esta es mi solución, muy simple.

Aquí está mi archivo menu.xml:

      

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

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

El siguiente código se usa para seleccionar el primer elemento y resaltar el primer elemento seleccionado en el menú.

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

Haga un selector para el elemento Individaual del cajón de navegación

      

Haga algunos cambios en su NavigationView

  

La manera más fácil es seleccionarlo de xml de la siguiente manera:

    

Tenga en cuenta la línea de android:checked="true"

Por alguna razón, es preferible encontrar el MenuItem usando las ID’s.

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

agregado en la versión 26.1.0

revisa este enlace