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?
- Elemento en negrita después de la selección
- ¿Qué tamaños debe tener una imagen en un cajón de navegación?
- Identificar el idioma RTL en Android
- Volley Android, cómo pasar post parámetros de forma dinámica
- Imagen de fondo estirando
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.
- Dos cajones de navegación en la misma actividad
- Cómo hacer juego multijugador
- Cómo compartir datos con Android Volley
- ¿Por qué mi PNG importado es de baja calidad
- Android - ¿En qué hilo se ejecutan los fragmentos?
- Cómo agregar un grupo al cajón de navegación mediante programación
- Modo horizontal en tableta solamente
- Cómo imprimir datos desde la aplicación de Android a la impresora WIFI?
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:
- Ha implementado
NavigationView.OnNavigationItemSelectedListener
en su actividad - Ya has llamado:
navigationView.setNavigationItemSelectedListener(this);
- 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);
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 construir una biblioteca de Android con Android Studio y gradle?
- ¿Qué es "android: allowBackup"?