web-dev-qa-db-ja.com

BottomNavigationViewで選択したアイテムを設定する方法

作成されたアクティビティにデフォルトのアイテムを設定しようとしていますが、機能しませんか?これは私のコードです:

_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);
}
_

しかし、navigation.setSelectedItemId(R.id.dietplan);は機能していないようです。下のナビゲーションバーのデフォルトアイテムを設定するのを手伝ってください:

これは私のスタックトレース(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) 
_
15
Abhijeet

作業中のソースコードを共有するだけ

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>

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;
    }
}
11
Magesh Pandian

選択する代わりに、そのアイテムをsetChecked(true)する必要があります。このコードを試してください

mBottomNavigationView=(BottomNavigationView)findViewById(R.id.bottom_nav);
mBottomNavigationView.getMenu().findItem(R.id.item_id).setChecked(true);

チェックされたアイテムは、BottomNavigationViewで強調表示されます。

28
Abhishek Singh

次を使用できます。

    navigationView?.menu?.findItem(drawableMenuItem.id)?.isChecked = true

OnNavigationItemSelectedListenerイベントは発生しません。

2

Abshishek's answerのKotlin拡張バージョン:

internal fun BottomNavigationView.checkItem(actionId: Int) {
    menu.findItem(actionId)?.isChecked = true
}

// use 
bottom_navigation.checkItem(R.id.navigation_home)

これはOnNavigationItemSelectedListenerをトリガーしません。

2

BottomNavigationメニュー項目に_Android:enabled="true"_を追加します。

_<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>
_

onCreate()メソッドで、bottomNavigationView.setOnNavigationItemSelectedListener(mListener)によってリスナーを設定します。

_bottomNavigationView.selectedItemId = R.id.menu_id_を実行して、選択する項目を設定します。

これにより、アクティビティが作成されるたびにNavigationItemSelectedListenerからonNavigationItemSelected()がトリガーされます。

1

これは私のために働く

アクティビティレイアウト:

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

クリックコールバック:

@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!
}
1

参考:フラグメントの場合、onCreateView

BottomNavigationView mBottomNavigationView = getActivity().findViewById(R.id.bottomNavigationView);

mBottomNavigationView.setSelectedItemId(R.id.your_item);
1
Ego Slayer

次のようなインデックスを使用して、BottomNavigatioViewで選択を設定することもできます。

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);
    }
1
SANAT

必要なのは、クリックされた要素がビューで無視され、「選択」として返されない場合、場合によっては、フラグメントの代わりにアクティビティを開く必要がある場合やデザインによってはクリックが処理された後にfalseを返すことができますこれにより、アクティビティが閉じられた後、選択された一番下のアイテムになります。

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
}
0
Rodolfo Abarca