2017-03-08 2 views
2

Dans mon bottomNavigationView je peux modifier par programme mes éléments de menu tout ce qu'il semble fonctionner, mais en fait ma mise en page est différente de si est cochée ou si je clique directement sur l'onglet. S'il vous plaît examiner les différences ci-dessous:Android BottomNavigationView menuItem ensemble vérifié ne fonctionne pas correctement

1) pour menuItem.setChecked(true):

enter image description here

2) lorsqu'un utilisateur clique directement sur l'icône, il effectuera l'animation et l'afficher sur la bonne

enter image description here

Eh bien ce que je veux vraiment, c'est de sélectionner le menuItem comme si l'utilisateur avait cliqué. Ne doit pas fonctionner en faisant menuItem.setChecked (true)?

S'il vous plaît prendre en considération la mise en page de définition suivante pour les éléments de menu:

<item android:id="@+id/menu_home" 
    android:title="@string/menu_home" 
    android:icon="@drawable/ic_home_black_24dp" 
    app:showAsAction="ifRoom" /> 

<item android:id="@+id/menu_hall_of_fame" 
    android:title="@string/menu_hall_of_fame" 
    android:icon="@drawable/ic_stars_black_24dp" 
    app:showAsAction="ifRoom" /> 

<item android:id="@+id/menu_info" 
    android:title="@string/menu_info" 
    android:icon="@drawable/ic_info_black_24dp" 
    app:showAsAction="ifRoom" /> 

<item android:id="@+id/menu_settings" 
    android:title="@string/menu_settings" 
    android:icon="@drawable/ic_settings_black_24dp" 
    app:showAsAction="ifRoom" /> 

et comment je vérifie la ligneMenu correcte:

MenuItem item = mBottomNav.getMenu().findItem(R.id.menu_about); 

    // update selected item 
    mSelectedItem = item.getItemId(); 

    // uncheck the other items and select the one. 
    for (int i = 0; i< mBottomNav.getMenu().size(); i++) { 
     MenuItem menuItem = mBottomNav.getMenu().getItem(i); 
     menuItem.setChecked(menuItem.getItemId() == mSelectedItem); 


    } 

Il existe une autre méthode pour effectuer une sélection d'un menuItem? Qu'est-ce que j'oublie ici?

Répondre

1

Voir ce que je poste ici tout le code

public class MainActivity extends AppCompatActivity { 
private static final String SELECTED_ITEM = "arg_selected_item"; 

private BottomNavigationView mBottomNav; 
private int mSelectedItem; 

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

    mBottomNav = (BottomNavigationView) findViewById(R.id.navigation); 
    mBottomNav.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { 
     @Override 
     public boolean onNavigationItemSelected(@NonNull MenuItem item) { 
      selectFragment(item); 
      return true; 
     } 
    }); 

    MenuItem selectedItem; 
    if (savedInstanceState != null) { 
     mSelectedItem = savedInstanceState.getInt(SELECTED_ITEM, 0); 
     selectedItem = mBottomNav.getMenu().findItem(mSelectedItem); 
    } else { 
     selectedItem = mBottomNav.getMenu().getItem(0); 
    } 
    selectFragment(selectedItem); 
} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    outState.putInt(SELECTED_ITEM, mSelectedItem); 
    super.onSaveInstanceState(outState); 
} 

@Override 
public void onBackPressed() { 
    MenuItem homeItem = mBottomNav.getMenu().getItem(0); 
    if (mSelectedItem != homeItem.getItemId()) { 
     // select home item 
     selectFragment(homeItem); 
    } else { 
     super.onBackPressed(); 
    } 
} 

private void selectFragment(MenuItem item) { 
    Fragment frag = null; 
    // init corresponding fragment 
    switch (item.getItemId()) { 
     case R.id.menu_home: 
      frag = MenuFragment.newInstance(getString(R.string.text_home), 
        getColorFromRes(R.color.color_home)); 
      break; 
     case R.id.menu_notifications: 
      frag = MenuFragment.newInstance(getString(R.string.text_notifications), 
        getColorFromRes(R.color.color_notifications)); 
      break; 
     case R.id.menu_search: 
      frag = MenuFragment.newInstance(getString(R.string.text_search), 
        getColorFromRes(R.color.color_search)); 
      break; 
    } 

    // update selected item 
    mSelectedItem = item.getItemId(); 

    // uncheck the other items. 
    Menu menu = mBottomNav.getMenu(); 
    for (int i = 0, size = menu.size(); i < size; i++) { 
     MenuItem menuItem = menu.getItem(i); 
     ((MenuItemImpl) menuItem).setExclusiveCheckable(false); 
     menuItem.setChecked(menuItem.getItemId() == R.id.menu_home); 
     ((MenuItemImpl) menuItem).setExclusiveCheckable(true); 
    } 

    updateToolbarText(item.getTitle()); 

    if (frag != null) { 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     ft.add(R.id.container, frag, frag.getTag()); 
     ft.commit(); 
    } 
} 

private void updateToolbarText(CharSequence text) { 
    ActionBar actionBar = getSupportActionBar(); 
    if (actionBar != null) { 
     actionBar.setTitle(text); 
    } 
} 

private int getColorFromRes(@ColorRes int resId) { 
    return ContextCompat.getColor(this, resId); 
} 

}

vous pouvez utiliser ce code

Menu menu = mBottomNav.getMenu(); 
    for (int i = 0, size = menu.size(); i < size; i++) { 
     MenuItem menuItem = menu.getItem(i); 
     ((MenuItemImpl) menuItem).setExclusiveCheckable(false); 
     menuItem.setChecked(menuItem.getItemId() == R.id.menu_home); 
     ((MenuItemImpl) menuItem).setExclusiveCheckable(true); 
    } 
+0

sauib, que voulez-vous dire par 'MenuItemImpl' pouvez-vous expliquer un peu plus à propos de ce code .. – ePascoal