Android поддающийся проверке пункт меню

У меня есть следующее расположение меню в моем приложении для Android:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/item1" 
          android:titleCondensed="Options"
          android:title="Highlight Options" 
          android:icon="@android:drawable/ic_menu_preferences" />

   <item android:id="@+id/item2" 
         android:titleCondensed="Persist"
         android:title="Persist" 
         android:icon="@android:drawable/ic_menu_preferences" 
         android:checkable="true" />
</menu>

Моя проблема состоит в том, что второй пункт меню, кажется, не является "поддающимся проверке", когда я запускаю свое приложение в эмуляторе Android. Должна быть зеленая галочка об объекте, правильно? Указать что его поддающееся проверке.

Я делаю что-то не так?

59
задан 17 March 2015 в 17:29

2 ответа

Ответ, потому что ответы здесь кажутся длинными и замысловатыми.. Я имею некоторый точный код Kotlin здесь

Переопределение Ваше действие наверху и переопределяю функцию onMenuItemClick, Имею функцию для обработки нажатия кнопки для открытия меню.

Имеют массив или список, который содержит проверенное значение и устанавливает проверку, когда меню воссоздается

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

class exampleActivity : AppCompatActivity(), PopupMenu.OnMenuItemClickListener {
   private var checkChecked = arrayListOf(false,false)
   //some code

  fun clickBTN(v: View){
        val popup = PopupMenu(this,v)
        popup.setOnMenuItemClickListener(this)
        popup.inflate(R.menu.yourmenufilename)
        //assuming you have 2 or more menu items
        popup.menu[0].isChecked = checkChecked[0]
        popup.menu[1].isChecked = checkChecked[1]
        popup.show()
  }

  override fun onMenuItemClick(item: MenuItem?): Boolean {
     when(item?.itemID){
        R.id.item0 -> {
                item.isChecked = !item.isChecked
                checkChecked[0] = item.isChecked
                return true
        }
        R.id.item1 -> {
                item.isChecked = !item.isChecked
                checkChecked[1] = item.isChecked
                return true
        }
  }
}

, конечно, в XML, у Вас должна быть своя установка Кнопки и Меню. Меню в качестве примера здесь

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/item0"
        android:title="@string/hi"
        android:checkable="true"/>
    <item android:id="@+id/item1"
        android:title="@string/yo"
        android:checkable="true"/>
</menu>
1
ответ дан 1 November 2019 в 11:56

ЧИТАЕТ ЭТО

, Как был сказан, "проверка руководства" является только верхушкой айсберга. Это высвечивает меню далеко так быстро , пользователи не видят, что что-либо происходит , и это - самый интуитивный счетчик, срыв и эффективно чрезвычайное дерьмо. REAL TASK (поэтому) позволяет событию флажка быть переваренным пользовательским умом.

Хорошие новости: это может быть сделано , и это действительно работает, и это - то, как Вы делаете это. @TouchBoarder имел его лучше всего, таким образом, я скопирую его код. затем разработайте его.

идея состоит в том, чтобы обнаружить, если флажок нажат, то (и только если тот выбран) немного подавляют удаление меню, добавьте, что таймер для 500 мс затем закрывает меню, это дает анимацию "галочки" времени флажка для выполнения, и создает правильное "чувство"

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/action_favorite"
        android:checkable="true"
        android:title="@string/action_favorite"
        app:actionViewClass="android.widget.CheckBox"
        app:showAsAction="ifRoom|withText" />
</menu>

затем, Вы делаете этот метод, как обычно, но Вы удостоверяетесь, что добавляете весь этот дополнительный bumpf

public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the bottom bar and the top bar (weird)
    BottomAppBar bottomBar = findViewById(R.id.bottom_app_bar_help);
    Menu bottomMenu = bottomBar.getMenu();
    getMenuInflater().inflate(R.menu.bottom_nav_menu, bottomMenu);
    for (int i = 0; i < bottomMenu.size(); i++) {
        bottomMenu.getItem(i).setOnMenuItemClickListener(item -> {
            if (item.getItemId()==R.id.action_favorite){
                item.setChecked(!item.isChecked());
                // Keep the popup menu open
                item.setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
                item.setActionView(new View(frmMain.this));
                item.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {
                    @Override
                    public boolean onMenuItemActionExpand(MenuItem item) {
                        final Handler handler = new Handler();
                        handler.postDelayed(() -> bottomMenu.close(), 500);
                        return false;
                    }

                    @Override
                    public boolean onMenuItemActionCollapse(MenuItem item) {
                        final Handler handler = new Handler();
                        handler.postDelayed(() -> bottomMenu.close(), 500);
                        return false;
                    }
                });
                return false;
            }
            else {
                return onOptionsItemSelected(item);
            }
        });
    }
    return true;
}

, который другие события меню здесь

public boolean onOptionsItemSelected(MenuItem item) {
    // Bottom Bar item click
    try {
        switch (item.getItemId()) {
            case R.id.mnuExit:
                MenuClick(ClickType.LOGOUT);
                return true;

            case R.id.mnuList:
                MenuClick(ClickType.LIST);
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return super.onOptionsItemSelected(item);
}
0
ответ дан 1 November 2019 в 11:56

Другие вопросы по тегам:

Похожие вопросы: