2016-12-29 12 views
1

Как мне понравился дизайн от BottomNavigationView Я решил реализовать с ним новое меню для своего приложения, вместо простого использования простых кнопок.BottomNavigationView - Как снять отметку со всех пунктов меню и отобразить заголовки?

Я принял this пост в качестве ориентира.

Согласно BottomNavigationView «s documentation, его цель состоит в том, чтобы

provide quick navigation between top-level views of an app. It is primarily designed for use on mobile.

В моем случае, я просто хочу, чтобы каждый MenuItem начать деятельность, но по умолчанию всегда один MenuItem выбран:

enter image description here

Я попытался установить белый цвет с:

app:itemIconTint="@color/white" 
app:itemTextColor="@color/white" 

Тем не менее, явно выбран MenuItem отличается от других (Размер заголовка больше), который до сих пор беспокоит меня:

enter image description here

Я пришел с идеей поместить скрытый MenuItem, чтобы выбрать, как:

<item 
android:id="@+id/uncheckedItem" 
android:title="" /> 

и сделать его вид GONE:

bottomNavigationView.getMenu().findItem(R.id.uncheckedItem).setChecked(true); 
bottomNavigationView.findViewById(R.id.uncheckedItem).setVisibility(View.GONE); 

Это делает все MenuItems бесконтрольно, но по умолчанию BottomNavigationView является Hidding названия, так как он имеет более 3 MenuItems для отображения, даже если четвертый MenuItem является оседают GONE:

enter image description here

Так что мой вопрос остается , есть ли/удалить, чтобы отменить выбор всех пунктов меню и сохранить их заголовки?

ответ

2

Я нашел свое решение, слияние моего прогресса с сообщением this.

Шаги:

  1. Обновление proguard-rules.pro и синхронизации построить
  2. Создать Helper отключить BottomNavigationView переключения режима
  3. создать элемент, чтобы скрыть в меню.XML
  4. Inflate BottomNavigationView
  5. Устанавливаемая быть скрыты в Проверил GONE
  6. Используйте Helper, чтобы отключить Shifting режим

Выход:

enter image description here

Рабочий код:

proguard-rules.pro:

-keepclassmembers class android.support.design.internal.BottomNavigationMenuView { 
    boolean mShiftingMode; 
} 

BottomNavigationShiftHelper.java:

public class BottomNavigationShiftHelper { 

    private final static String TAG = "DEBUG_BOTTOM_NAV_UTIL"; 

    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) { 
      Log.d(TAG, "Unable to get shift mode field"); 
     } catch (IllegalAccessException e) { 
      Log.d(TAG, "Unable to change value of shift mode"); 
     } 
    } 
} 

активность Sample.java:

private void loadNavigationBar() { 
     BottomNavigationView bottomNavigationView = (BottomNavigationView) 
       findViewById(R.id.navigation_bar); 

     bottomNavigationView.getMenu().findItem(R.id.uncheckedItem).setChecked(true); 
     bottomNavigationView.findViewById(R.id.uncheckedItem).setVisibility(View.GONE); 

     BottomNavigationViewUtils.disableShiftMode(bottomNavigationView); 

     bottomNavigationView.setOnNavigationItemSelectedListener(
       new BottomNavigationView.OnNavigationItemSelectedListener() { 
        @Override 
        public boolean onNavigationItemSelected(@NonNull MenuItem item) { 
         switch (item.getItemId()) { 
          case R.id.newList: 
           //Do The Math 
           break; 
          case R.id.loadList: 
           //Do The Math 
           break; 
          case R.id.settings: 
           //Do The Math 
           break; 
         } 
         return false; 
        } 
       }); 
    } 

Ботт omNavigationMenu.xml:

<?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/newList" 
     android:enabled="true" 
     android:icon="@drawable/new_list" 
     android:title="@string/common.button.list.new" 
     app:showAsAction="withText" /> 
    <item 
     android:id="@+id/loadList" 
     android:enabled="true" 
     android:icon="@drawable/load" 
     android:title="@string/common.button.list.load" 
     app:showAsAction="withText" /> 
    <item 
     android:id="@+id/settings" 
     android:enabled="true" 
     android:icon="@drawable/settings" 
     android:title="@string/common.label.settings" 
     app:showAsAction="withText" /> 
    <item 
     android:id="@+id/uncheckedItem" 
     android:title="" /> 
</menu> 

BottomNavigationComponent (внутри Activity.xml):

<android.support.design.widget.BottomNavigationView 
    android:id="@+id/navigation_bar" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    app:itemIconTint="@color/white" 
    app:itemTextColor="@color/white" 
    android:background="@drawable/BottomNavigationMenu.xml" 
    app:menu="@menu/supercart_bottom_navigation" /> 
+0

это работает, но теперь мой вид снизу навигации не брать всю ширину ... не могли бы вы помочь – TheGreat004

+0

я получил следующее issue, https://github.com/ittianyu/BottomNavigationViewEx/issues/25 – TheGreat004

+1

У меня есть 5 элементов, и если я добавляю пустой элемент, я получаю эту ошибку: Максимальное количество элементов, поддерживаемых BottomNavigationView, равно 5 – Kusan

1

Ваше решение кажется изменить пространство между элементами

Существует мое решение:

«Просто установите цвет щелчка так же, как цвет un-clicked».

, например:

private void changeMenuItemCheckedStateColor(BottomNavigationView bottomNavigationView, String checkedColorHex, String uncheckedColorHex) { 
    int checkedColor = Color.parseColor(checkedColorHex); 
    int uncheckedColor = Color.parseColor(uncheckedColorHex); 

    int[][] states = new int[][] { 
      new int[] {-android.R.attr.state_checked}, // unchecked 
      new int[] {android.R.attr.state_checked}, // checked 

    }; 

    int[] colors = new int[] { 
      uncheckedColor, 
      checkedColor 
    }; 

    ColorStateList colorStateList = new ColorStateList(states, colors); 

    bottomNavigationView.setItemTextColor(colorStateList); 
    bottomNavigationView.setItemIconTintList(colorStateList); 

} 

, если вы хотите, чтобы снять флажок все детали, вы можете

changeMenuItemCheckedStateColor(mBottomNavigationView, "#999999", "#999999"); 

, если вы хотите восстановить настройки цвета, вы можете

changeMenuItemCheckedStateColor(mBottomNavigationView, "FF743A", "999999"); 
3

Спасибо за вашу идею. Я реализовал его в своей библиотеке. У меня есть лучший способ сделать это за счет отражения. Поэтому он не будет показывать пространство.

Если у вас есть интерес. Нажмите здесь: https://github.com/ittianyu/BottomNavigationViewEx

private void initBottomViewAndLoadFragments(final BottomNavigationViewEx bnve) { 
    bnve.enableAnimation(false); 
    bnve.enableShiftingMode(false); 
    bnve.enableItemShiftingMode(false); 

    // use the unchecked color for first item 
    bnve.setIconTintList(0, getResources().getColorStateList(R.color.bnv_unchecked_black)); 
    bnve.setTextTintList(0, getResources().getColorStateList(R.color.bnv_unchecked_black)); 

    bnve.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { 

     private boolean firstClick = true; 
     private int lastItemId = -1; 

     @Override 
     public boolean onNavigationItemSelected(@NonNull MenuItem item) { 
      // restore the color when click 
      if (firstClick) { 
       firstClick = false; 
       bnve.setIconTintList(0, getResources().getColorStateList(R.color.selector_bnv)); 
       bnve.setTextTintList(0, getResources().getColorStateList(R.color.selector_bnv)); 
      } 

      if (firstClick || lastItemId == -1 || lastItemId != item.getItemId()) { 
       lastItemId = item.getItemId(); 
      } else { 
       return false; 
      } 

      // do stuff 
      return fillContent(item.getItemId()); 
     } 
    }); 
} 

- Рез/цвет/selector_bnv.xml

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:color="@color/bnv_checked_white" android:state_checked="true" /> 
    <item android:color="@color/bnv_unchecked_black" /> 
</selector> 

- разреш/значения/цвета.xml

<color name="bnv_checked_white">@android:color/white</color> 
<color name="bnv_unchecked_black">@android:color/black</color> 
+0

Хорошая работа! Пожалуйста, напишите, как сделать первый раз необработанным. Не нашел код для этого в вашем репо. – oxied

+0

UPDATE: найдено в его репо: https://github.com/ittianyu/BottomNavigationViewEx/blob/master/app/src/main/java/com/ittianyu/bottomnavigationviewexsample/features/style/StyleActivity.java#L152 – oxied

+0

Также обновлено его сообщение с прямым примером кода. – oxied

0

Это то же, что и принятый ответ, за исключением того, что я изменил две строки кода, указанные ниже. При прохождении через BottomNavigationItemViews я устанавливаю флажок всегда, и я также устанавливаю checkable в false. Это не позволяет изменять элементы меню. Вам все еще нужно это правило Proguard:

 -keepclassmembers class android.support.design.internal.BottomNavigationMenuView { 
     boolean mShiftingMode; 
     } 

Обновленный код:

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); 
       item.setChecked(false); // <--- This line changed 
       item.setCheckable(false); // <-- This line was added 
      } 
     } 
     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"); 
     } 

    }