2012-12-09 15 views
43

Mam PopupMenu i wiem, że zwykłym sposobem powiązania menu z nim jest użycie popup.getMenuInflater().inflate(R.menu.my_menu, popup.getMenu()); lub czegoś podobnego. Mój problem polega na tym, że mam w menu szereg elementów, które chcę w menu i muszę mieć możliwość ich programowej zmiany w Javie. Jak mogę to zrobić?Programowanie elementów menu Popup automatycznie programowo

Dziękujemy!

Odpowiedz

93

Właśnie to wymyśliłem; dla każdego, kto pracuje w tym samym problemem po prostu zrobić:

popup.getMenu().add(groupId, itemId, order, title); 

dla każdego MenuItem chcesz dodać.

23

Po prostu utwórz menu podręczne rejestrując widok, pod którym pojawi się wyskakujące okienko i użyj metody getMenu(), aby dodać wartości. Nie zapomnij zadzwonić do show();

PopupMenu menu = new PopupMenu(this, view); 

menu.getMenu().add("titleRes"); 
menu.show(); 
11

Określa identyfikatory w popupmenu.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/slot1" 
      app:showAsAction="ifRoom|withText" 
      android:title="Movies" 
      android:visible="true"/> 
     <item 
      android:id="@+id/slot2" 
      app:showAsAction="ifRoom|withText" 
      android:title="Music" 
      android:visible="true"/> 
     <item 
      android:id="@+id/slot3" 
      app:showAsAction="ifRoom|withText" 
      android:title="Comedy" 
      android:visible="true"/> 

</menu> 

PopupMenu popupMenu = new PopupMenu(FullMenuActivity.this, view);      
popupMenu.setOnMenuItemClickListener(FullMenuActivity.this); 
popupMenu.getMenu().add(1, R.id.slot1, 1, "slot1"); 
popupMenu.getMenu().add(1,R.id.slot2,2,"slot2"); 
popupMenu.getMenu().add(1,R.id.slot3,3,"slot3"); 
popupMenu.show(); 

@Override 
    public boolean onMenuItemClick(MenuItem item) { 

     switch (item.getItemId()) { 
      case R.id.slot1: 
       SessionManager.selected_slot = item.getTitle().toString(); 
       Toast.makeText(this, "slot1 Clicked", Toast.LENGTH_SHORT).show(); 
       return true; 
      case R.id.slot2: 
       SessionManager.selected_slot = item.getTitle().toString(); 
       Toast.makeText(this, "slot2 Clicked", Toast.LENGTH_SHORT).show(); 
       return true; 
      case R.id.slot3: 
       SessionManager.selected_slot = item.getTitle().toString(); 
       Toast.makeText(this, "slot3 Clicked", Toast.LENGTH_SHORT).show(); 
       return true; 
      default: 
       return true; 
     } 
    } 
2

@Voora Tarun dał dobrą odpowiedź, a ja moją odpowiedź oparta na niej: Najpierw zamiast używać fa ke mune.xml zasoby, myślę, że lepszym rozwiązaniem jest stworzenie ids plik Zamiast:

ids.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <item name="menuGroup" type="id"/> 
    <item name="menu1" type="id"/> 
    <item name="menu2" type="id"/> 
    <item name="menu3" type="id"/> 
</resources> 

Następnie można zrobić coś takiego:

private void showPopup(final View anchor) { 
     PopupMenu popupMenu = new PopupMenu(anchor.getContext(), anchor); 
     popupMenu.getMenu().add(R.id.menuGroup, R.id.menu1, Menu.NONE, "slot1"); 
     popupMenu.getMenu().add(R.id.menuGroup, R.id.menu1, Menu.NONE,"slot2"); 
     popupMenu.getMenu().add(R.id.menuGroup, R.id.menu1, Menu.NONE,"slot3"); 
     popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 
      @Override 
      public boolean onMenuItemClick(MenuItem item) { 
       Toast.makeText(anchor.getContext(), item.getTitle() + "clicked", Toast.LENGTH_SHORT).show(); 
       return true; 
      } 
     }); 
     popupMenu.show(); 
    } 
2

Oto kompletne rozwiązanie z identyfikatorami określonymi i obsługiwane:

 this.findViewById(R.id.hamburger_menu).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
      PopupMenu menu = new PopupMenu(getApplicationContext(), v); 
      menu.getMenu().add(Menu.NONE, 1, 1, "Share"); 
      menu.getMenu().add(Menu.NONE, 2, 2, "Comment"); 
      menu.show(); 

      menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 
       @Override 
       public boolean onMenuItemClick(MenuItem item) { 

        int i = item.getItemId(); 
        if (i == 1) { 
         //handle share 
         return true; 
        } else if (i == 2) { 
         //handle comment 
         return true; 
        } else { 
         return false; 
        } 
       } 

      }); 
     } 
    }); 

Uwaga: udostępniają i komentują, na przykład, możesz również wstawiać stałe dla liczb 1,2, aby kod był bardziej czytelny.

Dodałem także Menu.NONE, ponieważ nie dbam o grupowanie pozycji menu. Jeśli chcesz ustawić grupę group id grupy = 1, 2, etc ...

12

tak.! to pomoże ci. Spróbuj tego :)

Dynamic_PopUpMenu.setOnClickListener (nowa View.OnClickListener() {

 @Override 
     public void onClick(View v) { 
      PopupMenu menu = new PopupMenu(DialogCheckBox.this, v); 
      menu.getMenu().add("AGIL"); 
      menu.getMenu().add("Dash"); 
      menu.getMenu().add("AGILarasan"); 
      menu.getMenu().add("Arasan"); 
      menu.show(); 
     } 
    }); 
Powiązane problemy