tutorial the support setonnavigationitemselectedlistener new library google exploring developer bottomnavigationbar bottomnavigation bottom bar activity android android-design-library androiddesignsupport selectedindex bottomnavigationview

the - navigation bar android



Establecer el índice/id del elemento seleccionado inicialmente en BottomNavigationView (7)

He implementado el nuevo BottomNavigationView (com.android.support:design:25.0.0) y no tengo idea de cómo configurar el índice de selección o el ID de artículo de MenuItem (en mi caso, el elemento intermedio debería estar seleccionado de forma predeterminada). Me temo que no hay tal posibilidad por ahora en la medida en que es demasiado crudo, pero de todos modos cualquier ayuda será apreciada. ¡Gracias!


Creo que esta solución puede ser un poco más elegante que la respuesta aceptada:

bottomNavigationView.getMenu().getItem(menuItemIndex).setChecked(true)

donde menuItemIndex es el índice del elemento seleccionado.


Establezca la ID del elemento del menú seleccionado usando setSelectedItemId :

bottomNavigationView.setSelectedItemId(R.id.item_id);

Este método comenzó a estar disponible en la biblioteca de soporte de Android 25.3.0.


Esto es lo BottomNavigationView dice BottomNavigationView respecto:

Los elementos del menú también se pueden usar para seleccionar mediante programación qué destino está activo actualmente. Se puede hacer usando MenuItem#setChecked(true)

Como alternativa a lo que Jan publicó, también puede encontrar el elemento por id:

Menu menu = findViewById(R.id.navigation).getMenu(); menu.findItem(R.id.navigation_home).setChecked(true);

Además, puedo recomendar llamar a .callOnClick() lugar de .performClick() .


La única solución que funcionó para mí es:

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

Simplemente haciendo clic en hacer el truco. Espero que tengamos métodos / propiedades adicionales en futuras versiones.

UPD:

Como mentioned , se agregó un nuevo método desde la Biblioteca de soporte de Android v25.3.0:

bottomNavigationView.setSelectedItemId(R.id.item_id);

así que usa en su lugar :)


Puede extender BottomNavigationView y usar la reflexión para invocar métodos privados.

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 { BottomNavigationMenuView menuView = (BottomNavigationMenuView) getField(BottomNavigationView.class, "mMenuView"); OnNavigationItemSelectedListener listener = (OnNavigationItemSelectedListener) getField(BottomNavigationView.class, "mListener"); try { Method method = menuView.getClass().getDeclaredMethod("activateNewButton", Integer.TYPE); method.setAccessible(true); // activate item. method.invoke(menuView, index); if (listener != null) { // trigger item select event. listener.onNavigationItemSelected(getMenu().getItem(index)); } } catch (SecurityException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { e.printStackTrace(); } } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } } private Object getField(Class clazz, String fieldName) throws NoSuchFieldException, IllegalAccessException { Field f = clazz.getDeclaredField(fieldName); f.setAccessible(true); return f.get(this); } }


Si está utilizando la escucha, como la implementación predeterminada en Android Studio, intente esto:

BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation); Integer indexItem = 4; navigation.getMenu().getItem(indexItem).setChecked(true); mOnNavigationItemSelectedListener.onNavigationItemSelected(navigation.getMenu().getItem(indexItem));


Deja de usar la reflexión! ¡Es malo!

Bueno, aunque la biblioteca de soporte no nos da la opción de seleccionar el elemento de BottomNavigationView para que se muestre la primera vez que esté visible, tenemos dos posibilidades:

Primero, usando loop:

private void setupBottomNavigationView() { // Get the menu from our navigationBottomView. Menu bottomNavigationViewMenu = bottomNavigationView.getMenu(); // Uncheck the first menu item (the default item which is always checked by the support library is at position 0). bottomNavigationMenu.findItem(R.id.action_one).setChecked(false); // Check the wished first menu item to be shown to the user. bottomNavigationMenu.findItem(R.id.action_two).setChecked(true); bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { Menu bottomNavigationMenu = bottomNavigationView.getMenu(); for (int i = 0; i < bottomNavigationMenu.size(); i++) { if (item.getItemId() != bottomNavigationMenu.getItem(i).getItemId()) { bottomNavigationMenu.getItem(i).setChecked(false); } } switch (item.getItemId()) { case R.id.action_one : replaceFragment(new OneFragment()); break; case R.id.action_two : replaceFragment(new TwoFragment()); break; case R.id.action_three : replaceFragment(new ThreeFragment()); break; } return false; } }); }

Segundo, sin bucle pero con una variable de clase (porque la lógica se realiza desde dentro de la clase interna):

private void setupBottomNavigationView() { // Get the menu from our navigationBottomView. Menu bottomNavigationViewMenu = bottomNavigationView.getMenu(); // Uncheck the first menu item (the default item which is always checked by the support library is at position 0). bottomNavigationViewMenu.findItem(R.id.action_one).setChecked(false); // Check the wished first menu item to be shown to the user. Also store that menu item on a variable to control when a menu item must be unchecked. mActiveBottomNavigationViewMenuItem = bottomNavigationViewMenu.findItem(R.id.action_two).setChecked(true); bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(@NonNull MenuItem selectedMenuItem) { switch (selectedMenuItem.getItemId()) { case R.id.action_one : replaceFragment(new OneFragment()); break; case R.id.action_two : replaceFragment(new TwoFragment()); break; case R.id.action_three : replaceFragment(new ThreeFragment()); break; } if (selectedMenuItem != mActiveBottomNavigationViewMenuItem){ mActiveBottomNavigationViewMenuItem.setChecked(false); mActiveBottomNavigationViewMenuItem = selectedMenuItem; } return false; } }); } private MenuItem mActiveBottomNavigationViewMenuItem;

¿Cuándo se ejecuta el método setupBottomNavigationView ()? En el método Activity onCreate (), eche un vistazo:

@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // ... setupBottomNavigationView(); }

Sencillo y sin extenso código.

¡Espero eso ayude!