147

android.support.design.widget.BottomNavigationViewサポート ライブラリの新しいものを使用しています。コードから現在の選択を設定するにはどうすればよいですか? 画面を回転させた後、選択が最初の項目に戻っていることに気付きました。BottomNavigationViewもちろん、onPause関数内の の現在の状態を「保存」する方法と でそれを復元する方法を誰かが教えてくれれば、それも役立ちますonResume

ありがとう!

4

23 に答える 23

9
@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

   bottomNavigationView.setOnNavigationItemSelectedListener(this);
   Menu menu = bottomNavigationView.getMenu();
   this.onNavigationItemSelected(menu.findItem(R.id.action_favorites));
}
于 2016-11-24T19:19:01.563 に答える
4

これはおそらく今後のアップデートで追加されるでしょう。しかし当面は、これを達成するためにリフレクションを使用できます。

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"/>
于 2016-10-28T23:54:01.320 に答える
4

プログラムで選択を実行する別の方法を追加するだけです-これはおそらく最初の意図であったか、後で追加された可能性があります。

Menu bottomNavigationMenu = myBottomNavigationMenu.getMenu();
bottomNavigationMenu.performIdentifierAction(selected_menu_item_id, 0);

はアイテム ID とフラグperformIdentifierActionを受け取ります。Menu

詳細については、ドキュメントを参照してください。

于 2016-11-20T21:41:53.343 に答える
4

SupportLibrary 25.1.0 で修正されたようです :) 編集: 画面を回転させると、選択状態が保存されるように修正されたようです。

于 2016-12-20T15:23:49.190 に答える
4

API 25 より上では setSelectedItemId(menu_item_id) を使用できますが、API 25 の下では別の方法で行う必要があります。ユーザー メニューでハンドルを取得してから、setChecked を Checked 特定のアイテムに設定します。

于 2018-04-05T13:44:06.910 に答える
2

これが役立つことを願っています

//Setting default selected menu item and fragment
        bottomNavigationView.setSelectedItemId(R.id.action_home);
        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.fragment_container, new HomeFragment()).commit();

これは、対応する下部のナビゲーション メニュー項目と同時に読み込まれるデフォルトのフラグメントを決定することです。同じものを OnResume コールバックに含めることができます

于 2020-02-08T11:45:41.903 に答える
0

反射は悪い考えです。

この要点に向かいます。選択を実行するだけでなく、コールバックも呼び出すメソッドがあります。

  @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;

    }
于 2016-11-15T22:50:10.700 に答える
0

この方法は私にとってはうまくいきます。

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()
    }
于 2020-07-14T10:04:36.380 に答える