Пункты меню Android onOptionsItemSelected styling menu

#android #android-menu #android-styles

#Android #android-меню #android-стили

Вопрос:

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

Я хотел бы иметь что-то вроде приведенных ниже методов-

 @Override
public boolean onOptionsItemSelected(MenuItem item) {
//     item.setSiblingsStyle(R.style.passive_menu_item);
//     item.setStyle(R.style.active_menu_item);
}
  

Можно ли стилизовать заголовок меню в методе «onOptionsItemSelected«? Пожалуйста, помогите!

Ответ №1:

Вы могли бы попробовать использовать определение селектора:

 <?xml version="1.0" encoding="utf-8"?>
  <selector xmlns:android="http://schemas.android.com/apk/res/android"

     <item android:state_pressed="true" android:color="@color/blue_light"/> <!-- pressed -->
     <item android:state_enabled="false" android:color="@color/grey_cloud"/> <!-- focused -->
     <item android:color="@color/black"/> <!-- default -->

  </selector>
  

Комментарии:

1. можете ли вы уточнить? Я не уверен, как использовать селекторы в меню

Ответ №2:

Я понял, что использование только текста — не очень хороший способ. Поэтому я решил добавить значки и использовать состояние элементов для переключения, сохраняя несколько переменных. Вот реализация:

 private current_selected_menu;
private main_menu;

public void updateMenuState(){
    if (main_menu==null){
        return;
    }
    int sz = main_menu.size();
    for(int i=0;i<sz;i  ){
        if(main_menu.getItem(i).getItemId()==current_selected_menu){
            main_menu.getItem(i).setEnabled(false);
        }
        else{
            main_menu.getItem(i).setEnabled(true);
        }
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.sample_menu, menu);
    current_selected_menu = menu.getItem(0).getItemId(); // I'm using first item as enabled by default
    main_menu = menu;
    int sz = menu.size();
    for(int i=0;i<sz;i  ){
        if(menu.getItem(i).getItemId()==current_selected_menu){
            menu.getItem(i).setEnabled(false);
        }
        else{
            menu.getItem(i).setEnabled(true);
        }
    }
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.item1:
         // Do something
         current_selected_menu = item.getItemId();
         updateMenuState();
         return true;
    case R.id.item2:
         // Do something
         current_selected_menu = item.getItemId();
         updateMenuState();
         return true;
    default:
         // Do Something
         return super.onOptionsItemSelected(item);
    }
}
  

Как было предложено Xingchen, можно использовать селекторы для определения нескольких значков. Ниже приведен пример реализации:

icon_selector.xml файл в res / drawable:

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

Примечание: icon_passive.png и icon_active.png — это два файла изображений, используемых в качестве значков.

sample_menu.xml файл в res/ меню:

 <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@ id/menu1" android:icon="@drawable/icon_selector" android:title="menu1" android:showAsAction="always|withText" android:visible="true"></item>
    <item android:id="@ id/menu2" android:icon="@drawable/icon_selector" android:title="menu2" android:showAsAction="always|withText" android:visible="true"></item>
    <item android:id="@ id/menu3" android:icon="@drawable/icon_selector" android:title="menu3" android:showAsAction="always|withText" android:visible="true"></item>
</menu>
  

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