Как программно изменить значки нижнего вида навигации? - PullRequest
1 голос
/ 03 апреля 2019

Я хочу знать, как я могу изменить значки нижнего вида навигации, когда пользователь в основном выбирает его, а затем снова заменить его на предыдущий значок, если пользователь выбирает другую опцию.

enter image description here Нижефрагмент кода моего переключателя.

switch (menuItem.getItemId ()) {

            case R.id.ic_home:

                selectedFragment = new HomeFragment();

                //menuItem.setIcon(R.drawable.like_colored);

                break;

            case R.id.ic_connect:

                selectedFragment = new ConnectionFragment();

                break;

            case R.id.ic_add:

                selectedFragment = new AddPostFragment();

                break;

            case R.id.ic_noti:

                selectedFragment = new NotificationFragment();

                break;

            case R.id.ic_profile:

                selectedFragment = new ProfileFragment();

                break;

Ответы [ 2 ]

2 голосов
/ 03 апреля 2019

Если вы хотите сделать это программно, сделайте это, установив для всех пунктов меню значки по умолчанию перед оператором switch.

navigation.getMenu().getItem(0).setIcon(R.drawable.defaultIcon1);
navigation.getMenu().getItem(1).setIcon(R.drawable.defaultIcon2);
navigation.getMenu().getItem(2).setIcon(R.drawable.defaultIcon3);
navigation.getMenu().getItem(3).setIcon(R.drawable.defaultIcon4);
navigation.getMenu().getItem(4).setIcon(R.drawable.defaultIcon5);
switch (menuItem.getItemId()) {
      case R.id.ic_home:
                selectedFragment = new HomeFragment();
                menuItem.setIcon(R.drawable.icon1);
                break;
      case R.id.ic_connect:
                selectedFragment = new ConnectionFragment();
                menuItem.setIcon(R.drawable.icon2);
                break;
      case R.id.ic_add:
                selectedFragment = new AddPostFragment();
                menuItem.setIcon(R.drawable.icon3);
                break;
      case R.id.ic_noti:
                selectedFragment = new NotificationFragment();
                menuItem.setIcon(R.drawable.icon4);
                break;
      case R.id.ic_profile:
                selectedFragment = new ProfileFragment();
                menuItem.setIcon(R.drawable.icon5);
                break;
}

Или Вы можете сделать это, отредактировав файлы XML вместо того, чтобы делать это программно.

вытяжка / homeIconSelector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/homeNormalIcon" android:state_checked="false"/>
    <item android:drawable="@drawable/homeSelectedIcon" android:state_checked="true"/>
</selector>

и ваш файл меню меню / (menunamehere) .xml

<item
android:id="@+id/navigation_home"
android:icon="@drawable/homeIconSelector"
android:title="@string/title_child" />
0 голосов
/ 16 июня 2019

Это изменит значок и цвет текста одного элемента меню из любого места (например, onResume).Код ниже прекрасно работает на 4.4.2 через (как минимум) пирог.Это кусочки отсюда и другие подобные темы.Некоторые примечания:

  1. Значок элемента меню можно нарисовать под названием «значок», но он не совсем корректно просто изменить его, как я делаю цвет текста - иногда значок (если есть)в XML появляется вместо.Кажется, это всегда работает.
  2. Она написана как статическая функция, поэтому ее можно вызывать из нескольких фрагментов;Вы можете легко сделать его членом и исключить аргумент активности в классе активности.
  3. Возможность рисования зависит от того, является ли он векторным или растровым для рисования для более старых API: код битовой карты (и нового API) являетсякомментарий;более новые API не нуждаются в определенной векторной функции рисования.
    static public void setMenuItemProperties(AppCompatActivity activity,
                                             MenuItem item,
                                             int resIconDrawable, int resColor) {
        int id = item.getItemId();

        BottomNavigationItemView m = activity.findViewById(id);
        TextView t1 = m.findViewById(R.id.smallLabel);
        TextView t2 = m.findViewById(R.id.largeLabel);
        t1.setTextColor(activity.getResources().getColor(resColor));
        t2.setTextColor(activity.getResources().getColor(resColor));

        Drawable d = VectorDrawableCompat.create(activity.getResources(), resIconDrawable, null);
        //Drawable d = activity.getResources().getDrawable(resIconDrawable);
        item.setIcon(d);
    }

Вызовите так (из Activity), чтобы выбрать между двумя значками и цветами текста для пункта меню 3. (navigation isBottomNavigationView.)

      setMenuItemProperties(this, navigation.getMenu().getItem(3),
          enabled ? R.drawable.ic_settings_red_24dp : R.drawable.ic_settings_redish_24dp,
          enabled ? android.R.color.white : R.color.medium_dark_grey);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...