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


229

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

Gracias por tu apoyo.


¿Alguna de las respuestas onNavigationItemSelectedactiva acciones para la identificación seleccionada?
Prabs

Respuestas:


478

Usa el siguiente código:

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

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

El getItem(int index)método obtiene la MenuItemcontinuación, se puede llamar al setChecked(true);en que MenuItem, todo lo que queda es que hacer es averiguar qué índice elemento que hace la tiene por defecto, y sustituir 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.


65
Se agregaron las bibliotecas de soporte de Android v23 setCheckedItem (int id).
Markus Rubey

1
@MarkusRubey incluso después de configurar setCheckedItem No puedo resaltar el elemento seleccionado. ¿Podría decir la posible razón?
Dexto

3
¡No funcionó para mí! Cuando se llama al método onNavigationItemSelected para otras opciones en el cajón del menú de navegación, el elemento inicial denominado "verificado" mantiene su estado siempre. Cuando uso 'navigationView.setCheckedItem (id);' funcionó a la perfección! Después de eso, debe llamar al método 'navigationView.getMenu () performIdentifierAction (R.id.nav_market, 0);' para realizar la selección del elemento deseado.
GFPF

3
Ninguno de los métodos mencionados me funcionó por alguna razón. Pero hacer navigationView.post(new Runnable() { navigationView.setCheckedItem(...) })... funcionó.
dimsuz

1
Probablemente esté intentando cambiar el elemento marcado de un hilo diferente al hilo principal :)
Arlind

105

También puedes llamar a:

navigationView.setCheckedItem(id);

Este método se introdujo 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"

Ver también esto


1
incluso después de configurar setCheckedItem, no puedo resaltar el elemento seleccionado. ¿Podría decir la posible razón?
Dexto

3
@DeepeshDoshi Asegúrese de tener un comportamiento comprobable.
Jared Burrows

1
debería navegarView.setCheckedItem (R.id.menu_nav_home) para seleccionar el menú de inicio
jaga

para el artículo individual solo agregue android:checkable="true"más, no se comprobará por sí mismo.
sud007

También asegúrese de no llamar a este método desde navItemSelecteListenerya que el elemento está seleccionado después de que este método regrese.
mallaudin

47

Para mí, estos dos métodos no funcionaron:

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

Prueba este, me funciona.

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


2
Gracias por este consejo Los métodos anteriores están realmente bien, pero el problema es diferente: si los usa, no se llamará a onNavigationItemSelected, solo se comprobará el elemento del menú. Entonces necesitamos llamar a ambos métodos.
user1209216

2
onNavigationItemSelected (navView.getMenu (). getItem (0)); o onNavigationItemSelected (navView.getMenu (). getItem (R.id.nav_profile)); ambos funcionaron para mí, getitem en lugar de finditem.
Harsh Dalwadi

30

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


2
Esta es una forma de hacerlo, me gusta. Sin embargo, las respuestas de solo código a menudo se desaconsejan. Editaría su respuesta para explicar un poco el código, como por qué lo usa performIdentifierActiony qué está sucediendo onNavigationItemSelected. Para usted puede parecer sencillo, pero un desarrollador más nuevo puede tener problemas para comprender su código.
AdamMc331

@ McAdam331 Por supuesto, siéntase libre, hoy está medio desaparecido y no tuvo tiempo de escribir con más detalle.
GFPF

25

Siempre hay problemas con las bibliotecas de soporte de Google "oh, qué bien". Si desea verificar un elemento sin degradar su versión de libs de soporte, simplemente configure checkable 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 checkable en el menú archivos xml



9

API 23 proporciona el siguiente método:

navigationView.setCheckedItem(R.id.nav_item_id);

Sin embargo, por alguna razón, esta función no provocó la ejecución del código detrás del elemento de navegación. El método ciertamente resalta el elemento en el cajón de navegación, o lo 'revisa', pero no parece llamar al OnNavigationItemSelectedListenerresultado en una pantalla en blanco al inicio si su 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 supone:

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

6

Tienes que llamar a 2 funciones para esto:

Primero: para excitar los comandos que ha implementado en onNavigationItemSelectedlistener:

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í.


5

El siguiente código solo seleccionará el elemento del 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));


4

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ú. La siguiente línea hará algo (por ejemplo: mostrar el primer fragmento, etc.). NOTA: escriba después de 'configurar su código de cajón'

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

4

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

<menu>
   <group android:checkableBehavior="single">
         <item
              android:checked="true"
              android:id="@+id/nav_home"
              android:icon="@drawable/nav_home"
              android:title="@string/main_screen_title_home" />

Note la linea android:checked="true"


1
En mi opinión, la mejor respuesta es que causa la lógica predeterminada proporcionada por Android. Votado como mejor solo es mejor, si el menú está usando el diseño y generado por el adaptador, no el archivo xml del menú.
Andris

1
Esta es la mejor respuesta
Ganesh Chowdhary Sadanala

2

En primer lugar, crea 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 se puede declarar en style.xml

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

Y despues 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 puede ver, usé este mainNavigationMenu_.getMenu (). FindItem (itemId) .setChecked (true); para configurar el elemento seleccionado. Aquí navegaciónVer

 <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"/>

Me gusta este método, actualmente lo uso en mi propio proyecto. Puede ser útil incluir el @color/state_listcódigo en su respuesta. Por curiosidad, ¿de dónde sacaste la convención de nomenclatura para poner un guión bajo al final del nombre de la variable? Nunca he visto ese enfoque.
AdamMc331

Creo que quizás quieras en menuItem.getItemId()lugar deitemId
Craig Russell

2

Al usar BottomNavigationViewlas otras respuestas como navigationView.getMenu().getItem(0).setChecked(true);y navigationView.setCheckedItem(id);no funcionará, las llamadas setSelectedItemIdfuncionan:

    BottomNavigationView bottomNavigationView = findViewById(R.id.bottom_navigation_view);

    bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
            // TODO: 10-Aug-19 your code here 
        }
    });

    bottomNavigationView.setSelectedItemId(R.id.myitem);

0

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

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/darkBlue" android:state_pressed="true"/>
    <item android:drawable="@color/darkBlue" android:state_checked="true"/>
    <item android:drawable="@color/textBlue" />
</selector>

Realice algunos cambios en su NavigationView

<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:itemBackground="@drawable/drawer_item"
        android:background="@color/textBlue"
        app:itemIconTint="@color/white"
        app:itemTextColor="@color/white"
        app:menu="@menu/activity_main_drawer"
        />

0

en su actividad (detrás del cajón):

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar,
               R.string.navigation_drawer_open,
               R.string.navigation_drawer_close);
    drawer.addDrawerListener(toggle);
    toggle.syncState();

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);
    navigationView.setCheckedItem(R.id.nav_portfolio);
    onNavigationItemSelected(navigationView.getMenu().getItem(0));
}

y

@Override
public boolean onNavigationItemSelected(MenuItem item) {
    // Handle navigation view item clicks here.
    int id = item.getItemId();

    Fragment fragment = null;

    if (id == R.id.nav_test1) {
        fragment = new Test1Fragment();
        displaySelectedFragment(fragment);
    } else if (id == R.id.nav_test2) {
        fragment = new Test2Fragment();
        displaySelectedFragment(fragment);
    }

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
}

y en tu menú:

<group android:checkableBehavior="single">

    <item
        android:id="@+id/nav_test1"
        android:title="@string/test1" />

    <item
        android:id="@+id/nav_test2"
        android:title="@string/test2" />

  </group>

así que el primer menú está resaltado y se muestra como menú predeterminado.


0

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

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

¿Puede decirme cómo y dónde está accesible este OnNavigationItemSelected? Proporcione un ejemplo de código más completo.
kilokahn


-1

Por alguna razón, es preferible encontrar el MenuItem usando los ID.

drawer.getMenu().findItem(R.id.action_something).setChecked(true);
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.