J'ai ajouté BottomNavigationView
dans mon application, comme.
main.xml
<Android.support.design.widget.BottomNavigationView
Android:id="@+id/bottom_navigation"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_alignParentBottom="true"
app:itemBackground="@color/colorPrimary"
app:itemIconTint="@color/white"
app:itemTextColor="@color/white"
app:menu="@menu/bottom_navigation_main" />
bottom_navigation_main.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto">
<item
Android:id="@+id/action_favorites"
Android:enabled="true"
Android:icon="@drawable/ic_favorite_white_24dp"
Android:title="@string/text_favorites"
app:showAsAction="ifRoom" />
<item
Android:id="@+id/action_schedules"
Android:enabled="true"
Android:icon="@drawable/ic_access_time_white_24dp"
Android:title="@string/text_schedules"
app:showAsAction="ifRoom" />
<item
Android:id="@+id/action_music"
Android:enabled="true"
Android:icon="@drawable/ic_audiotrack_white_24dp"
Android:title="@string/text_music"
app:showAsAction="ifRoom" />
</menu>
MainActivity click
bottomNavigationView.setOnNavigationItemSelectedListener(
new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.action_favorites:
//need change icon of favotites here.
case R.id.action_schedules:
case R.id.action_music:
}
return true;
}
});
Je veux changer l'icône de la navigation en bas de la position sélectionnée. Comment pouvons-nous obtenir cette fonctionnalité lorsque l'utilisateur clique sur un élément?
(Si l'utilisateur a cliqué sur un élément, l'icône est remplacée par un autre)
Vous devez réinitialiser l'icône onclick, puis sur le boîtier du commutateur, vous ne devez définir que celui que vous devez modifier, donc uniquement lorsque cette option est sélectionnée, l'icône change.
Menu menu = bottomNavigationView.getMenu();
menu.findItem(R.id.action_favorites).setIcon(favDrawable);
switch (item.getItemId()) {
case R.id.action_favorites:
item.setIcon(favDrawableSelected);
case R.id.action_schedules:
case R.id.action_music:
}
Vous pouvez simplement créer un sélecteur pouvant être dessiné dans un dossier pouvant être dessiné et l'image peut être modifiée en fonction de l'état du widget utilisé dans la vue.
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:drawable="@drawable/calender_green" Android:state_checked="true"/>
<item Android:drawable="@drawable/calender_black" Android:state_checked="false"/>
</selector>
Si les solutions ci-dessus ne vous permettent pas de modifier l'icône de l'élément sélectionné, ajoutez la ligne ci-dessous à votre code:
bottomNavigationView.setItemIconTintList(null);
Cela désactivera l'effet de teinte de l'icône de l'élément sélectionné.
J'ai eu le même problème. J'ai ajouté un sélecteur pouvant être dessiné pour changer l'icône de l'élément BottomNavigationView lorsqu'il est coché/sélectionné.
D'accord, je voulais comprendre comment attribuer à chaque élément sa propre image et, avec une certaine confusion dans les commentaires sur l'endroit où il devrait aller, je voulais dactylographier cette réponse.
Commencez par créer votre menu et ses éléments. Votre sélecteur ira à l'intérieur de ces éléments dans la valeur [~ # ~] icône [~ # ~] . Ici nous avons 2 sélecteurs, chacun fait pour son article de menu.
item
Android:id="@+id/navigation_home"
Android:icon="@drawable/navigation_home_selector"
Android:title="@string/title_home" />
item
Android:id="@+id/navigation_profile"
Android:icon="@drawable/navigation_profile_selector"
Android:title="@string/title_profile" />
Maintenant, voici votre fichier de sélecteur qui sera logé dans votre dossier pouvant être dessiné.
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:drawable="@drawable/menu_selected" Android:state_checked="true"/>
<item Android:drawable="@drawable/menu" Android:state_checked="false"/>
</selector>
La dernière étape a été fournie par @ KishanSolanki124
Ajoutez cette ligne de code à votre BottomNavigationView.
BottomNavigationView.setItemIconTintList(null);
Voilà. Tout fonctionne comme un charme.
J'ai trouvé que cette approche est préférable d'utiliser sélecteur dessinable: -
Au début, créez un fichier XML dans votre dossier pouvant être dessiné. Par exemple, le nom du fichier XML est child_selector.xml dans le dossier pouvant être dessiné.
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:drawable="@drawable/child" Android:state_checked="false"/>
<item Android:drawable="@drawable/child_fill" Android:state_checked="true"/>
</selector>
Ajoutez simplement child_selector dans le menu de votre bottom_navigation_main.xml: -
J'aime: Android: icon = "@ drawable/child_selector"
Exemple:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item
Android:id="@+id/navigation_child"
Android:icon="@drawable/child_selector"
Android:title="@string/title_child" />
</menu>
Et vous devez ajouter la ligne suivante dans votre activité.
bottomNavigationView.setItemIconTintList(null);
Bonne chance.
Créez un sélecteur et spécifiez le dessin pour chaque état (par exemple, les états cochés et non cochés)
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:drawable="@drawable/calender_green" Android:state_checked="true"/>
<item Android:drawable="@drawable/calender_black" Android:state_checked="false"/>
</selector>
Merci pour la méthode selector
qui fonctionne pour moi (api v26
)
Pour ceux qui se demandent comment le redéfinir sur Origine icône non sélectionnée par programmation, envisagez de l'ajouter à votre OnNavigationItemSelectedListener
avant votre switch(Java)
ou when(Kotlin)
:
private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
navigation.menu.getItem(0).setIcon(R.drawable.ic_tab_home)
navigation.menu.getItem(1).setIcon(R.drawable.ic_tab_account)
navigation.menu.getItem(2).setIcon(R.drawable.ic_tab_trading)
navigation.menu.getItem(3).setIcon(R.drawable.ic_tab_wallet)
when (item.itemId) {
R.id.navigation_home -> {
message.setText(R.string.title_home)
item.setIcon(R.drawable.ic_tab_home_active)
return@OnNavigationItemSelectedListener true
}
R.id.navigation_account -> {
message.setText(R.string.title_account)
item.setIcon(R.drawable.ic_tab_account_active)
return@OnNavigationItemSelectedListener true
}
R.id.navigation_trading -> {
message.setText(R.string.title_trading)
item.setIcon(R.drawable.ic_tab_trading_active)
return@OnNavigationItemSelectedListener true
}
R.id.navigation_wallet-> {
message.setText(R.string.title_wallet)
item.setIcon(R.drawable.ic_tab_wallet_active)
return@OnNavigationItemSelectedListener true
}
}
false
}
Trouvé la réponse. on peut utiliser
item.setIcon(R.drawable.icon_name)
pour changer l'icone .. va essayer d'importer la réponse
bottomNavigationView.setOnNavigationItemSelectedListener(
new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.action_favorites:
//change the icon
item.setIcon(R.drawable.icon_name);
case R.id.action_schedules:
case R.id.action_music:
}
return true;
}
});