在我的menu.xml文件中为BottomNavigationView添加4个项目后,它仅显示所选项目标题并隐藏所有其他标题.
我可以强制显示标题和图标.
这是我的代码.
我可以强制显示标题和图标.
这是我的代码.
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/action_home" android:enabled="true" android:icon="@drawable/ic_home_24dp" android:title="@string/text_home" app:showAsAction="ifRoom" /> <item android:id="@+id/action_category" android:enabled="true" android:icon="@drawable/ic_grid_24dp" android:title="@string/text_category" app:showAsAction="ifRoom" /> <item android:id="@+id/action_me" android:enabled="true" android:icon="@drawable/ic_me_24dp" android:title="@string/text_me" app:showAsAction="ifRoom" /> <item android:id="@+id/action_setting" android:enabled="true" android:icon="@drawable/ic_cog_24dp" android:title="@string/text_setting" app:showAsAction="ifRoom" /> </menu>
<android.support.design.widget.BottomNavigationView android:id="@+id/bottom_navigation" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:background="@android:color/white" android:elevation="6dp" android:translationZ="6dp" app:menu="@menu/bottom_navigation_main" />
解决方法
试试这个代码,
activity_main.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:design="http://schemas.android.com/apk/res-auto" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.segunfamisa.sample.bottomnav.MainActivity"> <FrameLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:background="#f1f1f1"> </FrameLayout> <android.support.design.widget.BottomNavigationView android:id="@+id/navigation" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="start" design:menu="@menu/bottom_nav_items" /> </LinearLayout>
fragment_menu.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/fragment_content" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.segunfamisa.sample.bottomnav.MenuFragment"> <TextView android:id="@+id/text" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerInParent="true" android:textColor="@android:color/white" android:gravity="center" /> </RelativeLayout>
在菜单文件夹中创建此文件,
bottom_nav_items.xml:
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/action_home" android:enabled="true" android:icon="@android:drawable/ic_dialog_map" android:title="One" app:showAsAction="ifRoom"/> <item android:id="@+id/action_category" android:enabled="true" android:icon="@android:drawable/ic_dialog_info" android:title="Two" app:showAsAction="ifRoom"/> <item android:id="@+id/action_me" android:enabled="true" android:icon="@android:drawable/ic_dialog_email" android:title="Three" app:showAsAction="ifRoom"/> <item android:id="@+id/action_setting" android:enabled="true" android:icon="@android:drawable/ic_popup_reminder" android:title="Four" app:showAsAction="ifRoom"/> </menu>
MainActivity.java:
public class MainActivity extends AppCompatActivity { private static final String SELECTED_ITEM = "arg_selected_item"; private BottomNavigationView mBottomNav; private int mSelectedItem; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mBottomNav = (BottomNavigationView) findViewById(R.id.navigation); disableShiftMode(mBottomNav); mBottomNav.setonNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { selectFragment(item); return true; } }); MenuItem selectedItem; if (savedInstanceState != null) { mSelectedItem = savedInstanceState.getInt(SELECTED_ITEM,0); selectedItem = mBottomNav.getMenu().findItem(mSelectedItem); } else { selectedItem = mBottomNav.getMenu().getItem(0); } selectFragment(selectedItem); } public static void disableShiftMode(BottomNavigationView view) { BottomNavigationMenuView menuView = (BottomNavigationMenuView) view.getChildAt(0); try { Field shiftingMode = menuView.getClass().getDeclaredField("mShiftingMode"); shiftingMode.setAccessible(true); shiftingMode.setBoolean(menuView,false); shiftingMode.setAccessible(false); for (int i = 0; i < menuView.getChildCount(); i++) { BottomNavigationItemView item = (BottomNavigationItemView) menuView.getChildAt(i); item.setShiftingMode(false); // set once again checked value,so view will be updated item.setChecked(item.getItemData().isChecked()); } } catch (NoSuchFieldException e) { //Timber.e(e,"Unable to get shift mode field"); } catch (illegalaccessexception e) { //Timber.e(e,"Unable to change value of shift mode"); } } @Override protected void onSaveInstanceState(Bundle outState) { outState.putInt(SELECTED_ITEM,mSelectedItem); super.onSaveInstanceState(outState); } @Override public void onBackpressed() { MenuItem homeItem = mBottomNav.getMenu().getItem(0); if (mSelectedItem != homeItem.getItemId()) { // select home item selectFragment(homeItem); } else { super.onBackpressed(); } } private void selectFragment(MenuItem item) { Fragment frag = null; // init corresponding fragment switch (item.getItemId()) { case R.id.action_home: frag = MenuFragment.newInstance(getString(R.string.text_home),getColorFromres(R.color.color_home)); break; case R.id.action_category: frag = MenuFragment.newInstance(getString(R.string.text_notifications),getColorFromres(R.color.color_notifications)); break; case R.id.action_me: frag = MenuFragment.newInstance(getString(R.string.text_search),getColorFromres(R.color.color_search)); break; case R.id.action_setting: frag = MenuFragment.newInstance(getString(R.string.text_home),getColorFromres(R.color.color_home)); break; } // update selected item mSelectedItem = item.getItemId(); // uncheck the other items. for (int i = 0; i < mBottomNav.getMenu().size(); i++) { MenuItem menuItem = mBottomNav.getMenu().getItem(i); menuItem.setChecked(menuItem.getItemId() == item.getItemId()); } updatetoolbarText(item.getTitle()); if (frag != null) { FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.add(R.id.container,frag,frag.getTag()); ft.commit(); } } private void updatetoolbarText(CharSequence text) { ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.setTitle(text); } } private int getColorFromres(@ColorRes int resId) { return ContextCompat.getColor(this,resId); }
MenuFragment.java:
public class MenuFragment extends Fragment { private static final String ARG_TEXT = "arg_text"; private static final String ARG_COLOR = "arg_color"; private String mText; private int mColor; private View mContent; private TextView mTextView; public static Fragment newInstance(String text,int color) { Fragment frag = new MenuFragment(); Bundle args = new Bundle(); args.putString(ARG_TEXT,text); args.putInt(ARG_COLOR,color); frag.setArguments(args); return frag; } @Override public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) { // Inflate the layout for this fragment return inflater.inflate(R.layout.fragment_menu,container,false); } @Override public void onViewCreated(View view,@Nullable Bundle savedInstanceState) { super.onViewCreated(view,savedInstanceState); // retrieve text and color from bundle or savedInstanceState if (savedInstanceState == null) { Bundle args = getArguments(); mText = args.getString(ARG_TEXT); mColor = args.getInt(ARG_COLOR); } else { mText = savedInstanceState.getString(ARG_TEXT); mColor = savedInstanceState.getInt(ARG_COLOR); } // initialize views mContent = view.findViewById(R.id.fragment_content); mTextView = (TextView) view.findViewById(R.id.text); // set text and background color mTextView.setText(mText); mContent.setBackgroundColor(mColor); } @Override public void onSaveInstanceState(Bundle outState) { outState.putString(ARG_TEXT,mText); outState.putInt(ARG_COLOR,mColor); super.onSaveInstanceState(outState); } }
无论您需要做什么,只需禁用BottomNavigationView Shift模式,
在你的代码中使用此方法.
public static void disableShiftMode(BottomNavigationView view) { BottomNavigationMenuView menuView = (BottomNavigationMenuView) view.getChildAt(0); try { Field shiftingMode = menuView.getClass().getDeclaredField("mShiftingMode"); shiftingMode.setAccessible(true); shiftingMode.setBoolean(menuView,"Unable to change value of shift mode"); } }
像这样调用这个方法,
mBottomNav = (BottomNavigationView) findViewById(R.id.navigation); disableShiftMode(mBottomNav);
它会工作.我在这里附上截图,