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)
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;
}
}
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
.
Vous pouvez utiliser:
navigationView?.menu?.findItem(drawableMenuItem.id)?.isChecked = true
et il ne déclenchera pas OnNavigationItemSelectedListener
événements.
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.
Ç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!
}
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);
}
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
}
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
.