Power showing icon and name in support of BottomNavigationView android

After adding 4 elements in my menu.xml file for BottomNavigationView, only the selected element name is displayed and hides from all other names. May I show the title and icon. here is my code.

<?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" /> 
+8
source share
6 answers

Try this code,

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> 

Make this file inside the menu folder,

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

all you have to do is just turn off the BottomNavigationView shift mode using this method in your code.

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

call this method as follows:

 mBottomNav = (BottomNavigationView) findViewById(R.id.navigation); disableShiftMode(mBottomNav); 

He will work. Here you can add a screenshot,

enter image description here

+18
source

It is just like this:

Kotlin

 bottomNavigationView.labelVisibilityMode=LabelVisibilityMode.LABEL_VISIBILITY_LABELED 

Java

 bottomNavigationView.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED) 
+13
source

First of all, I find a longer solution to this problem. I had a simpler solution.

Add this class to your application:

 class BottomNavigationViewHelper { @SuppressLint("RestrictedApi") public static void removeShiftMode(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) { Log.e("ERROR NO SUCH FIELD", "Unable to get shift mode field"); } catch (IllegalAccessException e) { Log.e("ERROR ILLEGAL ALG", "Unable to change value of shift mode"); } } 

}

and then add this to your activity when bottomnavigationview is available

 BottomNavigationViewHelper.removeShiftMode(bottomNavigationView);//disable BottomNavigationView shift mode 

This will disable the navigation switching mode and text, and the icon will always be displayed.

+7
source

after library support 28.0.0, LabelVisibilityMode support.

xml config: app: labelVisibilityMode = "labeled"

  <android.support.design.widget.BottomNavigationView android:id="@+id/bottom_navigation" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="0dp" android:background="?bottom_tint_color" app:elevation="@dimen/padding_4" app:labelVisibilityMode="labeled" app:itemIconTint="?drawer_tint_color" app:itemTextColor="?drawer_tint_color" app:menu="@menu/bottom_navigation_lite"/> 

or

you can call:

 BottomNavigationView.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED); 
+4
source

This works for me:

  navigation = (BottomNavigationView) view.findViewById(R.id.bottom_navigation); try{disableShiftMode(navigation);}catch(Exception ew){} 

Make this method in your activity or fragment where you want to call:

  @SuppressLint("RestrictedApi") 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); item.setChecked(item.getItemData().isChecked()); } } catch (NoSuchFieldException e) { } catch (IllegalAccessException e) { } } 
0
source

Starting with the 28-alpha support library, we can use the app:labelVisibilityMode in the BottomNavigation component. The value we can use is labeled , unlabeled , selected and auto .

  • labeled will keep all tags visible.
  • unlabeled only icons will be displayed.
  • selected will only display the label for the selected item and the offset of the items.
  • auto selects flagged or selected based on the number of elements that we marked for 1-3 elements and selected for 3+ elements.

This is a usage example:

 <android.support.design.widget.BottomNavigationView android:id="@+id/mainBottomNav" android:layout_width="match_parent" android:layout_height="wrap_content" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintBottom_toBottomOf="parent" app:elevation="@dimen/dimen_8dp" app:menu="@menu/bottom_menu" app:labelVisibilityMode="labeled"/> 
0
source

Source: https://habr.com/ru/post/1261963/


All Articles