Ich verwende das neue "android.support.design.widget.BottomNavigationView" aus der Support-Bibliothek.
Wie kann ich die aktuelle Auswahl im Code festlegen? Mir ist aufgefallen, dass die Auswahl nach dem Drehen des Bildschirms wieder auf das erste Element zurückgesetzt wird. Natürlich wäre es auch hilfreich, wenn mir jemand sagen könnte, wie man den aktuellen Zustand des BottomNavigationView
in der Funktion onPause
speichert und in onResume
wiederherstellt.
Danke!
Dies wird wahrscheinlich in kommenden Updates hinzugefügt werden. Aber in der Zwischenzeit können Sie dies mit Hilfe von Reflexion erreichen.
Erstellen Sie eine benutzerdefinierte Ansicht, die von BottomNavigationView erweitert wird, und greifen Sie auf einige ihrer Felder zu.
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 {
Field f = BottomNavigationView.class.getDeclaredField("mMenuView");
f.setAccessible(true);
BottomNavigationMenuView menuView = (BottomNavigationMenuView) f.get(this);
try {
Method method = menuView.getClass().getDeclaredMethod("activateNewButton", Integer.TYPE);
method.setAccessible(true);
method.invoke(menuView, index);
} catch (SecurityException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
}
Und verwenden Sie diese dann in Ihrer xml-Layout-Datei.
<com.your.app.SelectableBottomNavigationView
android:id="@+id/bottom_navigation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:itemBackground="@color/primary"
app:itemIconTint="@drawable/nav_item_color_state"
app:itemTextColor="@drawable/nav_item_color_state"
app:menu="@menu/bottom_navigation_menu"/>
Ich Sie don't wollen, um Ihren Code zu ändern. Wenn ja, empfehle ich Ihnen, BottomNavigationViewEx。 zu versuchen.
Sie müssen nur eine Methode setCurrentItem(index);
und getCurrentItem()
。 ersetzen.
Reflexion ist eine schlechte Idee.
Gehen Sie zu diesem gist. Es gibt eine Methode, die die Auswahl durchführt, aber auch den Callback aufruft:
@CallSuper
public void setSelectedItem(int position) {
if (position >= getMenu().size() || position < 0) return;
View menuItemView = getMenuItemView(position);
if (menuItemView == null) return;
MenuItemImpl itemData = ((MenuView.ItemView) menuItemView).getItemData();
itemData.setChecked(true);
boolean previousHapticFeedbackEnabled = menuItemView.isHapticFeedbackEnabled();
menuItemView.setSoundEffectsEnabled(false);
menuItemView.setHapticFeedbackEnabled(false); //avoid hearing click sounds, disable haptic and restore settings later of that view
menuItemView.performClick();
menuItemView.setHapticFeedbackEnabled(previousHapticFeedbackEnabled);
menuItemView.setSoundEffectsEnabled(true);
mLastSelection = position;
}