Estoy usando la nueva android.support.design.widget.BottomNavigationView de la biblioteca de compatibilidad.
¿Cómo puedo configurar el actual selección de código? Me di cuenta, que la selección se cambia de nuevo a la primera cuestión, después de la rotación de la pantalla. Por supuesto, también sería de ayuda, si alguien me pudiese decir, cómo «salvar» el estado actual de la BottomNavigationView en el onPause función y cómo restaurarla en onResume.

Gracias!

  • Acabo de mirar en la fuente y tengo la misma pregunta.. no Se ve como hay un método para ajustar el elemento seleccionado, y BottomNavigationView no hace ningún ahorro interno del estado. Probablemente esperar que esto sea incluido en una futura actualización. Duplicado (con algo más de información aquí: stackoverflow.com/questions/40236786/…
InformationsquelleAutor Michael | 2016-10-23

17 Comentarios

  1. 134

    De la API de 25.3.0 fue introducido el método de setSelectedItemId(int id) que vamos a marcar un elemento como seleccionado como si estuviera intervenido.

    Desde google docs:

    Ajuste el elemento de menú seleccionado ID. Este se comporta de la misma como tocar en un elemento.

    Ejemplo de código:

    BottomNavigationView bottomNavigationView;
    bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottomNavigationView);
    bottomNavigationView.setOnNavigationItemSelectedListener(myNavigationItemListener);
    bottomNavigationView.setSelectedItemId(R.id.my_menu_item_id);

    IMPORTANTE

    Que DEBE ya han añadido todos los elementos del menú y configurar el Detector antes de llamar a setSelectedItemId para que el BottomNavigationView puede ejecutar el código correspondiente del comportamiento. Si usted llama setSelectedItemId antes de la adición de los elementos de menú y configuración de la escucha nada va a pasar.

    • Esto NO funciona, sólo actualiza la ficha en sí, no desencadenar una setOnNavigationItemSelectedListener evento
    • Si no se ha definido el comportamiento en el onTabSelected obviamente no va a hacer nada. Leer la documentación -> Establecer el elemento de menú seleccionado ID. Este se comporta de la misma como tocar en un elemento. Es a partir de los Desarrolladores de Android
    • Me es altamente recomendable para depurar y revisar lo que están haciendo mal. Ya he implementado tres BottomNavigationView Aplicaciones y nunca tuve un problema con este método.
    • Cuando puedo añadir esto a mi fragmento, solicitud se bloquea al entrar a ese fragmento
    • que es, probablemente, debido a su aplicación en OnNavigationItemSelectedListener. Los médicos dicen claramente que «setSelectedItemId()` se comporta de la misma como tocar en un elemento. La aplicación también se bloquea cuando se pulsa sobre ellos?
    • su ANR y cerrar la aplicación. Le ayuda a hacer que el fondo en la vista de navegación de la pestaña de selección de otro fragmento de la misma actividad
    • seguro, use el siguiente método en su fragmento: ((MyActivity)getActivity()).myBottomNavigationView.seSelectedItemId(R. id.itemId); déjame saber si se soluciona el problema
    • En mi caso no estaba trabajando, porque yo era la creación de navigationMenu a través de programación. Durante la construcción el clic no funciona. Después de que todos los elementos se agregan al menú, llamando setSelectedItemId() trabajado.

  2. 46

    Mediante programación, haga clic en el BottomNavigationBar artículo que usted necesita utilizar:

    View view = bottomNavigationView.findViewById(R.id.menu_action_item);
    view.performClick();

    Esto organiza todos los elementos con sus etiquetas correctamente.

    • Este es un hack sobre el problema. Usted tiene los métodos de la librería que te permitirá realizar lo que usted necesita. Si no puede, entonces es porque estás haciendo mal
  3. 44

    Para aquellos, que todavía se utilizan SupportLibrary < 25.3.0

    No estoy seguro de si esto es una respuesta completa a esta pregunta, pero mi problema es muy similar, tuve que procesar back pulse el botón y traer de usuario a la ficha anterior donde estaba. Así que, tal vez, mi solución va a ser útil para alguien:

    private void updateNavigationBarState(int actionId){
        Menu menu = bottomNavigationView.getMenu();
    
        for (int i = 0, size = menu.size(); i < size; i++) {
            MenuItem item = menu.getItem(i);
            item.setChecked(item.getItemId() == actionId);
        }
    }

    Por favor, tenga en cuenta que si el usuario pulse otra pestaña de navegación BottomNavigationView no borrar elemento seleccionado actualmente, por lo que necesita para llamar a este método en su onNavigationItemSelected después del procesamiento de acción de navegación:

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {
            case R.id.some_id_1:
                //process action
                break;
            case R.id.some_id_2:
                //process action
                break;
            ...
            default:
                return false;
        }
    
        updateNavigationBarState(item.getItemId());
    
        return true;
    }

    Sobre el ahorro de estado de la instancia creo que se podría jugar con la misma action id de vista de navegación y encontrar la solución adecuada.

  4. 10
    bottomNavigationView.setSelectedItemId(R.id.action_item1);

    donde action_item1 es elemento de menú ID.

  5. 8
    @Override
    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
    
       bottomNavigationView.setOnNavigationItemSelectedListener(this);
       Menu menu = bottomNavigationView.getMenu();
       this.onNavigationItemSelected(menu.findItem(R.id.action_favorites));
    }
  6. 6

    Ahora es posible desde 25.3.0 versión para llamar setSelectedItemId() \o/

  7. 4

    Agregar android:enabled="true" a BottomNavigationMenu Elementos.

    Y, a continuación, establezca bottomNavigationView.setOnNavigationItemSelectedListener(mListener) y
    se establece como seleccionado haciendo bottomNavigationView.selectedItemId = R.id.your_menu_id

    • Gracias, funcionó para mí.
  8. 3

    Esto probablemente será añadido en las próximas actualizaciones. Pero mientras tanto, para lograr esto, usted puede usar la reflexión.

    Crear una vista personalizada que se extiende desde BottomNavigationView y acceder a algunas de sus campos.

    public class SelectableBottomNavigationView extends BottomNavigationView {
    
        public SelectableBottomNavigationView(Context context) {
            super(context);
        }
    
        public SelectableBottomNavigationView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public SelectableBottomNavigationView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        public void setSelected(int index) {
            try {
                Field f = BottomNavigationView.class.getDeclaredField("mMenuView");
                f.setAccessible(true);
                BottomNavigationMenuView menuView = (BottomNavigationMenuView) f.get(this);
    
                try {
                    Method method = menuView.getClass().getDeclaredMethod("activateNewButton", Integer.TYPE);
                    method.setAccessible(true);
                    method.invoke(menuView, index);
                } catch (SecurityException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
                    e.printStackTrace();
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            }
        }
    
    }

    Y, a continuación, utilizar en el fichero xml de diseño.

    <com.your.app.SelectableBottomNavigationView
            android:id="@+id/bottom_navigation"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:itemBackground="@color/primary"
            app:itemIconTint="@drawable/nav_item_color_state"
            app:itemTextColor="@drawable/nav_item_color_state"
            app:menu="@menu/bottom_navigation_menu"/>
    • La reflexión es una mala idea!
    • Gran solución, gracias
    • performClick es mejor que el de la reflexión, en mi humilde opinión, en este caso.
  9. 3

    Por encima de la API de 25 puede utilizar setSelectedItemId(menu_item_id)
    pero en virtud de la API de 25 debe hacer de manera diferente,
    Menú de usuario para obtener manejar y, a continuación, setChecked Activada elemento específico

  10. 2

    Yo que usted no desea modificar su código.
    Si es así, que me recomienda usted para tratar de BottomNavigationViewEx

    Sólo se necesita reemplazar llamar a un método setCurrentItem(index); y getCurrentItem()

    Conjunto de elemento seleccionado en Android BottomNavigationView

  11. 2

    Acaba de añadir otra forma de realizar una selección a través de programación – esta es probablemente lo que fue la intención, en primer lugar, o tal vez esto se añadió más tarde.

    Menu bottomNavigationMenu = myBottomNavigationMenu.getMenu();
    bottomNavigationMenu.performIdentifierAction(selected_menu_item_id, 0);

    La performIdentifierAction toma un Menu id de elemento y una bandera.

    Ver el documentación para obtener más información.

    • Esto parece llevar a cabo la acción que pertenece al elemento de menú, pero no causa el elemento de menú que aparecen seleccionados. Pensé que el último fue lo que el OP quería, pero no estoy seguro.
  12. 1

    Usted puede probar el performClick método :

    View view = bottomNavigationView.findViewById(R.id.YOUR_ACTION);
    view.performClick();
  13. 0
    private void setSelectedItem(int actionId) {
        Menu menu = viewBottom.getMenu();
        for (int i = 0, size = menu.size(); i < size; i++) {
            MenuItem menuItem = menu.getItem(i);
            ((MenuItemImpl) menuItem).setExclusiveCheckable(false);
            menuItem.setChecked(menuItem.getItemId() == actionId);
            ((MenuItemImpl) menuItem).setExclusiveCheckable(true);
        }
    }

    El único ‘menos’ de la solución es el uso de MenuItemImpl, que es el ‘interior’ de la biblioteca (a pesar de público).

  14. 0

    SI USTED NECESITA DE FORMA DINÁMICA PASAR FRAGMENTO DE ARGUMENTOS ELLO

    Hay un montón de (en su mayoría repetidos o desactualizados) respuestas aquí, pero ninguno de ellos se encarga de una muy comunes en la necesidad de: dinámicamente pasar argumentos diferentes para el Fragmento cargado en una ficha.

    No se puede dinámicamente pasar argumentos diferentes para la carga Fragmento mediante setSelectedItemId(R.id.second_tab), que acaba de llamar a la estática OnNavigationItemSelectedListener. Para superar esta limitación he terminado de hacer esto en mi MainActivity que contiene las fichas:

    fun loadArticleTab(articleId: String) {
        bottomNavigationView.menu.findItem(R.id.tab_article).isChecked = true //use setChecked() in Java
        supportFragmentManager
            .beginTransaction()
            .replace(R.id.main_fragment_container, ArticleFragment.newInstance(articleId))
            .commit()
    }

    La ArticleFragment.newInstance() método se implementa como de costumbre:

    private const val ARG_ARTICLE_ID = "ARG_ARTICLE_ID"
    
    class ArticleFragment : Fragment() {
    
        companion object {
            /**
             * @return An [ArticleFragment] that shows the article with the given ID.
             */
            fun newInstance(articleId: String): ArticleFragment {
                val args = Bundle()
                args.putString(ARG_ARTICLE_ID, day)
                val fragment = ArticleFragment()
                fragment.arguments = args
                return fragment
            }
        }
    
    }
  15. -1

    Reflexión es mala idea.

    La cabeza a este gist. Hay un método que realiza la selección, pero también invoca la devolución de llamada:

      @CallSuper
        public void setSelectedItem(int position) {
            if (position >= getMenu().size() || position < 0) return;
    
            View menuItemView = getMenuItemView(position);
            if (menuItemView == null) return;
            MenuItemImpl itemData = ((MenuView.ItemView) menuItemView).getItemData();
    
    
            itemData.setChecked(true);
    
            boolean previousHapticFeedbackEnabled = menuItemView.isHapticFeedbackEnabled();
            menuItemView.setSoundEffectsEnabled(false);
            menuItemView.setHapticFeedbackEnabled(false); //avoid hearing click sounds, disable haptic and restore settings later of that view
            menuItemView.performClick();
            menuItemView.setHapticFeedbackEnabled(previousHapticFeedbackEnabled);
            menuItemView.setSoundEffectsEnabled(true);
    
    
            mLastSelection = position;
    
        }
    • Yo uso callOnClick() en lugar de performClick(), de esta manera no tengo que desactivar el sonido, que no trabajo con performClick() de todos modos.

Dejar respuesta

Please enter your comment!
Please enter your name here