2016-02-14 3 views
1

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

Мой код-то вроде этого для основных кнопок:

public boolean onOptionsItemSelected(MenuItem item){ 
     switch(item.getItemId()) { 
      case R.id.button1: 
       //do stuff 
       break; 
      case R.id.button2: 
       //display menu 
       break; 
} 

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

Отображение иконок в меню XML

<item 
     android:id="@+id/item_1" 
     android:icon="@drawable/settings" 
     android:showAsAction="always" 
     android:title="Add item1" /> 
+0

какой тип меню вы говорите? Это опциональное меню? –

ответ

1

Вы можете использовать PopupMenu В вашей onOptionsItemSelected(), который затем отобразит другое меню при нажатии одной из кнопок меню. Изменить этот кусок кода в соответствии с вашими потребностями:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    switch (item.getItemId()) { 
     case R.id.button1: 

      // DO SOMETHING HERE 
      break; 

     case R.id.button2: 

      // THE R.id.button2 has to be the same as the item that will trigger the popup menu. 
      View v = findViewById(R.id.button2); 
      PopupMenu pm = new PopupMenu(LoginActivity.this, v); 
      pm.getMenuInflater().inflate(R.menu.pm_accounts_item, pm.getMenu()); 
      pm.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 
       @Override 
       public boolean onMenuItemClick(MenuItem item) { 
        Toast.makeText(getApplicationContext(), String.valueOf(item.getTitle()), Toast.LENGTH_SHORT).show(); 
        switch (item.getItemId()) { 

         case R.id.menuEdit: 
          break; 

         case R.id.menuDetails: 
          break; 

         case R.id.menuDelete: 
          break; 

         default: 
          break; 
        } 
        return true; 
       } 
      }); pm.show(); 

      break; 

     default: 
      break; 
    } 

    return false; 
} 

Вы заметите, что новое меню XML было завышены на этой линии:

pm.getMenuInflater().inflate(R.menu.pm_accounts_item, pm.getMenu()); 

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

ВАЖНО! Не забудьте указать это View v = findViewById(R.id.button2); перед PopupMenu pm..... PopupMenu требует от View привязать себя. Но метод onOptionsItemSelected() не предусматривает этого вообще. Отсюда и дополнительное утверждение.

Приведенный выше пример иллюстрирует пример в Activity. Для того, чтобы использовать это в Fragment, изменить View v = findViewById(R.id.button2); к View v = getActivity().findViewById(R.id.button2);

Это конечный результат:

enter image description here

+1

Я думаю, что люблю тебя ...: D –

+0

Возможно ли показать значок для каждого элемента? Я попытался сделать привязку каждого элемента к значку, но появляется только текстовое имя значка. Я добавил то, что я пробовал в своем посте. –

+0

@swagantiswag: Извините, я все время отсутствовал. По умолчанию PopupMenu не поддерживает значки. Но на SO есть несколько решений, которые добились успеха именно так. Проверьте их: http://stackoverflow.com/q/6805756/450534, http://stackoverflow.com/q/15454995/450534. Существует github Gist, который показывает значки здесь: https://gist.github.com/mediavrog/9345938 –

0

Если говорить об открытии меню опций, тогда есть метод openOptionMenu() в Activity классе.

case R.id.button2: 
      openOptionsMenu(); 
      break; 

Если говорить об открытии Контекстное Вы должны вызвать openContextMenu() метод, но не забудьте добавить registerForContextMenu(view) и другие методы для принятия мер

Смежные вопросы