android.support.design.widget.BottomNavigationView
サポート ライブラリの新しいものを使用しています。コードから現在の選択を設定するにはどうすればよいですか? 画面を回転させた後、選択が最初の項目に戻っていることに気付きました。BottomNavigationView
もちろん、onPause
関数内の の現在の状態を「保存」する方法と でそれを復元する方法を誰かが教えてくれれば、それも役立ちますonResume
。
ありがとう!
android.support.design.widget.BottomNavigationView
サポート ライブラリの新しいものを使用しています。コードから現在の選択を設定するにはどうすればよいですか? 画面を回転させた後、選択が最初の項目に戻っていることに気付きました。BottomNavigationView
もちろん、onPause
関数内の の現在の状態を「保存」する方法と でそれを復元する方法を誰かが教えてくれれば、それも役立ちますonResume
。
ありがとう!
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
bottomNavigationView.setOnNavigationItemSelectedListener(this);
Menu menu = bottomNavigationView.getMenu();
this.onNavigationItemSelected(menu.findItem(R.id.action_favorites));
}
これはおそらく今後のアップデートで追加されるでしょう。しかし当面は、これを達成するためにリフレクションを使用できます。
BottomNavigationView から拡張されたカスタム ビューを作成し、そのフィールドのいくつかにアクセスします。
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();
}
}
}
そして、それを xml レイアウト ファイルで使用します。
<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"/>
プログラムで選択を実行する別の方法を追加するだけです-これはおそらく最初の意図であったか、後で追加された可能性があります。
Menu bottomNavigationMenu = myBottomNavigationMenu.getMenu();
bottomNavigationMenu.performIdentifierAction(selected_menu_item_id, 0);
はアイテム ID とフラグperformIdentifierAction
を受け取ります。Menu
詳細については、ドキュメントを参照してください。
SupportLibrary 25.1.0 で修正されたようです :) 編集: 画面を回転させると、選択状態が保存されるように修正されたようです。
API 25 より上では setSelectedItemId(menu_item_id) を使用できますが、API 25 の下では別の方法で行う必要があります。ユーザー メニューでハンドルを取得してから、setChecked を Checked 特定のアイテムに設定します。
これが役立つことを願っています
//Setting default selected menu item and fragment
bottomNavigationView.setSelectedItemId(R.id.action_home);
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, new HomeFragment()).commit();
これは、対応する下部のナビゲーション メニュー項目と同時に読み込まれるデフォルトのフラグメントを決定することです。同じものを OnResume コールバックに含めることができます
反射は悪い考えです。
この要点に向かいます。選択を実行するだけでなく、コールバックも呼び出すメソッドがあります。
@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;
}
この方法は私にとってはうまくいきます。
private fun selectBottomNavigationViewMenuItem(bottomNavigationView : BottomNavigationView,@IdRes menuItemId: Int) {
bottomNavigationView.setOnNavigationItemSelectedListener(null)
bottomNavigationView.selectedItemId = menuItemId
bottomNavigationView.setOnNavigationItemSelectedListener(this)
}
例
override fun onBackPressed() {
replaceFragment(HomeFragment())
selectBottomNavigationViewMenuItem(navView, R.id.navigation_home)
}
private fun replaceFragment(fragment: Fragment) {
val transaction: FragmentTransaction = supportFragmentManager.beginTransaction()
transaction.replace(R.id.frame_container, fragment)
transaction.commit()
}