作成されたアクティビティにデフォルトのアイテムを設定しようとしていますが、機能しませんか?これは私のコードです:
_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)
_
作業中のソースコードを共有するだけ
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;
}
}
選択する代わりに、そのアイテムをsetChecked(true)
する必要があります。このコードを試してください
mBottomNavigationView=(BottomNavigationView)findViewById(R.id.bottom_nav);
mBottomNavigationView.getMenu().findItem(R.id.item_id).setChecked(true);
チェックされたアイテムは、BottomNavigationView
で強調表示されます。
次を使用できます。
navigationView?.menu?.findItem(drawableMenuItem.id)?.isChecked = true
OnNavigationItemSelectedListener
イベントは発生しません。
Abshishek's answerのKotlin拡張バージョン:
internal fun BottomNavigationView.checkItem(actionId: Int) {
menu.findItem(actionId)?.isChecked = true
}
// use
bottom_navigation.checkItem(R.id.navigation_home)
これはOnNavigationItemSelectedListener
をトリガーしません。
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()
がトリガーされます。
これは私のために働く
アクティビティレイアウト:
<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!
}
参考:フラグメントの場合、onCreateView
BottomNavigationView mBottomNavigationView = getActivity().findViewById(R.id.bottomNavigationView);
mBottomNavigationView.setSelectedItemId(R.id.your_item);
次のようなインデックスを使用して、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);
}
必要なのは、クリックされた要素がビューで無視され、「選択」として返されない場合、場合によっては、フラグメントの代わりにアクティビティを開く必要がある場合やデザインによってはクリックが処理された後に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
}