web-dev-qa-db-fra.com

Comment définir l'élément sélectionné dans BottomNavigationView

J'essaie de définir un élément par défaut sur l'activité créée, mais cela ne fonctionne pas? C'est mon code: 

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_userhome);
    mTextMessage = (TextView) findViewById(R.id.message);
    profile = (FrameLayout) findViewById(R.id.profile);
    mall = (FrameLayout) findViewById(R.id.mall);
    dietplan =(FrameLayout) findViewById(R.id.dietplan);
    BottomNavigationView navigation = (BottomNavigationView) 
    findViewById(R.id.navigation);
    navigation.setSelectedItemId(R.id.dietplan);
     navigation.setOnNavigationItemSelectedListener 
    (mOnNavigationItemSelectedListener);
}

Mais il semble que navigation.setSelectedItemId(R.id.dietplan); ne fonctionne pas. Aidez-moi à définir l’élément par défaut de la barre de navigation inférieure:

Voici ma trace de pile (logcat): 

FATAL EXCEPTION: main
   Process: gym.Android.ommsoftware.gym, PID: 1915
   Java.lang.RuntimeException: Unable to start activity ComponentInfo{gym.Android.ommsoftware.gym/gym.Android.ommsoftware.gym.Userhome}: Java.lang.NullPointerException
       at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2404)
       at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2464)
       at Android.app.ActivityThread.access$900(ActivityThread.Java:172)
       at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1308)
       at Android.os.Handler.dispatchMessage(Handler.Java:102)
       at Android.os.Looper.loop(Looper.Java:146)
       at Android.app.ActivityThread.main(ActivityThread.Java:5653)
       at Java.lang.reflect.Method.invokeNative(Native Method)
       at Java.lang.reflect.Method.invoke(Method.Java:515)
       at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:1291)
       at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:1107)
       at dalvik.system.NativeStart.main(Native Method)
    Caused by: Java.lang.NullPointerException
       at gym.Android.ommsoftware.gym.Userhome.onCreate(Userhome.Java:57)
       at Android.app.Activity.performCreate(Activity.Java:5541)
       at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1093)
       at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2368)
       at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2464) 
       at Android.app.ActivityThread.access$900(ActivityThread.Java:172) 
       at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1308) 
       at Android.os.Handler.dispatchMessage(Handler.Java:102) 
       at Android.os.Looper.loop(Looper.Java:146) 
       at Android.app.ActivityThread.main(ActivityThread.Java:5653) 
       at Java.lang.reflect.Method.invokeNative(Native Method) 
       at Java.lang.reflect.Method.invoke(Method.Java:515) 
       at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:1291) 
       at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:1107) 
       at dalvik.system.NativeStart.main(Native Method) 
9
Abhijeet

Juste partager mon code source de travail

En XML, 

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:orientation="vertical"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">
    <Android.support.design.widget.BottomNavigationView
        Android:background="@color/colorWhite"
        Android:id="@+id/gfPrlBnvBtmView"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_gravity="start"
        Android:layout_alignParentBottom="true"
        app:menu="@menu/bottom_navigation_main" />
</LinearLayout>

En Java,

  public class TestActivity extends AppCompatActivity implements BottomNavigationView.OnNavigationItemSelectedListener
{
    private BottomNavigationView mBtmView;
    private int mMenuId;
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
        super.onCreate(savedInstanceState, persistentState);
        setContentView(R.layout.test);
        mBtmView = (BottomNavigationView) findViewById(R.id.gfPrlBnvBtmView);
        mBtmView.setOnNavigationItemSelectedListener(this);
        mBtmView.getMenu().findItem(R.id.action_yoga).setChecked(true);
    }

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        // uncheck the other items.
        mMenuId = item.getItemId();
        for (int i = 0; i < mBtmView.getMenu().size(); i++) {
            MenuItem menuItem = mBtmView.getMenu().getItem(i);
            boolean isChecked = menuItem.getItemId() == item.getItemId();
            menuItem.setChecked(isChecked);
        }

        switch (item.getItemId()) {
            case R.id.action_food: {
            }
            break;
            case R.id.action_medical: {
            }
            break;
            case R.id.action_yoga: {
            }
            break;
            case R.id.action_postures: {
            }
            break;
        }
        return true;
    }
}
5
Magesh Pandian

Au lieu de sélectionné, vous devez setChecked(true) cet élément. Essayez ce code

mBottomNavigationView=(BottomNavigationView)findViewById(R.id.bottom_nav);
mBottomNavigationView.getMenu().findItem(R.id.item_id).setChecked(true);

L'élément coché est mis en évidence dans BottomNavigationView.

18
Abhishek Singh

Vous pouvez utiliser:

    navigationView?.menu?.findItem(drawableMenuItem.id)?.isChecked = true

et il ne déclenchera pas OnNavigationItemSelectedListener événements.

1
Caipivara

AjoutezAndroid:enabled="true"à vos éléments de menu BottomNavigation.

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">
  <item
    Android:id="@+id/menu_id"
    Android:enabled="true"
    Android:icon="@drawable/ic_my_icon"
    Android:title="@string/menu_title"/>
</menu>

Et dans la méthode onCreate(), Configurez les écouteurs par bottomNavigationView.setOnNavigationItemSelectedListener(mListener).

Et définissez l’élément souhaité à sélectionner en faisant bottomNavigationView.selectedItemId = R.id.menu_id.

Cela déclenchera onNavigationItemSelected() à partir de la NavigationItemSelectedListener chaque fois que l'activité sera créée.

1
Rumaan Khalander

Ça marche pour moi

Présentation de l'activité:

<Android.support.design.widget.BottomNavigationView
        Android:id="@+id/bottomNavigation"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        app:itemBackground="@color/colorPrimary"
        app:itemIconTint="@color/tabs"
        app:itemTextColor="@color/tabs"
        app:menu="@menu/bottom_navigation_main" />

color/tabs.xml:

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">

    <item Android:color="@color/not_active" Android:state_checked="false"/>
    <item Android:color="@color/active" Android:state_checked="true"/>

</selector>

Cliquez sur le rappel:

@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_tab0:
            setFragment(f0);
            break;
        case R.id.action_tab1:
            setFragment(f1);
            break;
    }
    return true; // not false!
}
1

Vous pouvez également définir la sélection dans BottomNavigatioView en utilisant un index comme ceci:

public void selectBottomNavigationOption(int index) {
        switch (index) {
            case 0:
                index = R.id.action_1;
                break;
            case 1:
                index = R.id.action_2;
                break;
            case 2:
                index = R.id.action_3;
                break;
            case 3:
                index = R.id.action_4;
                break;
        }
        bottomNavigationView.setSelectedItemId(index);
    }
1
SANAT

Si ce que vous voulez, c’est que l’élément cliqué soit ignoré dans la vue et qu’il ne soit pas renvoyé comme "sélectionné", vous pouvez renvoyer false une fois le clic traité. Dans certains cas et pour certaines conceptions, il peut être nécessaire d’ouvrir une activité au lieu d’un fragment et cela permettra de sélectionner l'élément du bas après la fermeture de l'activité.

private val onNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
    when (item.itemId) {
        R.id.navigation_shipment -> {
            currentItem = TAB_INDEX_SHIPMENT
            val intent = Intent(this, BookShipmentActivity::class.Java)
            startActivity(intent)
            return@OnNavigationItemSelectedListener false
        }
    }
    false
}
0
Rodolfo Abarca

Version d'extension Kotlin de Abshishek's answer:

internal fun BottomNavigationView.checkItem(actionId: Int) {
    menu.findItem(actionId)?.isChecked = true
}

// use 
bottom_navigation.checkItem(R.id.navigation_home)

Cela ne déclenche pas OnNavigationItemSelectedListener.

0
Jemshit Iskenderov