2012-11-12 16 views
17

Mam PopupWindow, który chcę zakotwiczać do elementu menu paska akcji, ale nie mogę się tak wydawać, aby uzyskać na View elementu, który chcę kliknąć. Jest to wymagane w przypadku metody PopupWindowshowAsDropDown().Widok z paska menu pozycji

Czy ktoś wie, jak to osiągnąć?

Odpowiedz

35

można uzyskać za pomocą menu Widok Item ID, przez coraz to w onOptionsItemSelected ..

findViewById(R.id.menu_item); 
+1

Nie to nie działa Próbowałem tego przede wszystkim i po prostu zwraca zerowy wskaźnik. Ale i tak nie oczekiwałbym tego, ponieważ element na pasku akcji jest MenuItem, który nie wydaje się być Widokiem. Więc próbuję dostać się do View wewnątrz tego MenuItem – Kyros

+0

zależy od tego, gdzie go wywołasz, powinieneś wywołać to wewnątrz działania, aby uzyskać widok, a następnie przekazać go do twojego okna popup.it działa dla mnie – Nermeen

+0

Próbowałem znaleźć widok w OnCreate, gdzie go nazywasz? – Kyros

32

findViewById nie muszą być uruchamiane na onOptionsItemSelected w celu uzyskania widoku elementu działania.

należy jednak pamiętać, że czasami elementy akcji znajdują się w menu przepełnienia, więc zamiast tego można uzyskać wartość null.

więc, jak możesz to zrobić?

oto przykładowy kod:

public boolean onCreateOptionsMenu(final Menu menu) { 
    getSupportMenuInflater().inflate(R.menu.main, menu); 
    new Handler().post(new Runnable() { 
    @Override 
    public void run() { 
     final View menuItemView = findViewById(R.id.menu_action_item); 
     ... 

ten został przetestowany przy użyciu biblioteki ActionBarSherlock, na Androidzie 4.1.2 i Android 2.3.5.

Kolejną alternatywą jest szersze zastosowanie, używane na showcaseView library, here.

+0

Czy znasz jakieś dobre sposoby na to zrobić bez korzystania z bibliotek stron trzecich? –

+0

tak, zrób to samo bez użycia actionBarSherlock. coś, co przetestowałem, ta biblioteka pokazuje normalny, natywny pasek akcji, na wypadek gdyby wersja Androida miała 3.0 lub więcej –

+8

Używając tego również otrzymuję zerowy widok – ingsaurabh

-1

Co gdzie wezwanie:

activity.findViewById(R.id.menu_item); 

Jeśli kod wewnątrz fragmentu nie używać:

getView().findViewById(R.id.menu_item); 

on powróci NULL.

+0

nie działa. Ger odniesienie zerowe –

1

spotkam tego problemu, jak również, findViewById należy pracował u mego boku, oto przykładowy kod:

private void setDrawable(final Menu menu) { 
    if (menu == null || menu.size() == 0) return; 

    Utils.postToUiHandler(new Runnable() { 
     @Override 
     public void run() { 
      int size = menu.size(); 
      for (int i = 0; i < size; i++) { 
       MenuItem menuItem = menu.getItem(i); 
       if (menuItem != null) { 
        View view = activity.findViewById(menuItem.getItemId()); 
        if (view != null) { 
         Drawable drawable = ThemeDrawables.get(ThemeWorker.Segment.DEFAULT).actionbarButton(); 
         if (drawable != null && view.getBackground() != drawable) { 
          int sdk = android.os.Build.VERSION.SDK_INT; 
          if (sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) { 
           view.setBackgroundDrawable(drawable); 
          } else { 
           view.setBackground(drawable); 
          } 
         } 

        } 
       } 
      } 
     } 
    }); 

} 

Należy pamiętać, robię findViewById w wątku UI jako menuitem”widok nie jest napompowana tak powinien działać w wątku UI

Powiązane problemy