2014-10-02 13 views
12

ja ustawić własny widok na jedną z moich actionbar MenuBar jak tennie onOptionsItemSelected uzyskiwanie nazywane przy użyciu widoku niestandardowego działania

@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 

     getMenuInflater().inflate(R.menu.loop_thread, menu); 
     ImageView iv = (ImageView)(getLayoutInflater().inflate(R.layout.image_container, null)); 
     menu.findItem(R.id.action_filter).setActionView(iv); 
     ... 

ale kiedy dotknij tego elementu menu w mojej aplikacji, onOptionsItemSelected() nie zostanie wywołana. (Sprawdziłem to poprzez ustawienie punktu przerwania na początku metody). Jeśli dotknę innych przycisków, na pasku akcji zostanie wywołana metoda onOptionsItemSelected().

oto kod xml fo RMY widoku niestandardowego:

<?xml version="1.0" encoding="utf-8"?> 
<ImageView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/ibtnFilterMenu" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="@android:color/darker_gray" 
    android:src="@drawable/btn_action_down_arrow" 
    style = "@android:style/Widget.ActionButton"/> 

Ja również próbował ustawienie widoku działania na pliku menu xml:

<item android:id="@+id/action_filter" 
    android:title="@string/filter_options" 
    android:actionLayout="@layout/image_container" 
    android:orderInCategory="100" 
    android:showAsAction="ifRoom" /> 

Uwaga: Wiem, że mogę to zrobić obraz można kliknąć i ręcznie ustawić dla niego metodę onClickListener, ale ze względu na proces uczenia się, chcę dojść do sedna.

+0

A jak wygląda twoja metoda 'onOptionsItemSelected()'? – Sajmon

+0

To nie ma znaczenia, mam punkt przerwania ustawiony na początku metody i nie jest on w ogóle wywoływany. – Siavash

+0

Czy wypróbowałeś metodę 'setActionView', która akceptuje identyfikator zasobu zamiast widoku, nadmuchujesz ręcznie? –

Odpowiedz

23

Wydaje się, że ogólny kod, który nadmuchuje i czerpie elementy działania, nie łączy zawartość niestandardowy układ ustalonym przez setActionView() lub przez android:actionLayout="@layout/image_container".

Prawdopodobnie dlatego, że układ może być dowolny, a tylko przycisk lub obraz. Muszę więc ręcznie ustawić ikonę dla ikony onClickListener. Dla celów organizacji, po prostu zadzwonię pod numer onOptionsItemSelected() z metody mojej ikony, ale mógłbym zdefiniować akcję wewnątrz metody onClick.

po pierwsze, zadeklaruj filterMenuItem w swoim Activity.

MenuItem filterMenuItem; 

public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.loop_thread, menu); 
    filterMenuItem = menu.findItem(R.id.action_filter); 

    filterMenuItem.getActionView().setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      MainActivity.this.onOptionsItemSelected(filterMenuItem); 
    } 
}); 
+3

W metodzie onClick należy wywołać onMenuItemSelected (0, filterMenuItem); zamiast tego, jeśli chcesz propagować wywołania onOptionsItemSelected poprzez implementacje w fragmentach swojej aktywności. – Piaf

+1

Korzystanie z actionlayout powoduje, że mój przedmiot nie odpowiada za pomocą kliknięcia, czy to domyślne zachowanie? –

+2

Tak, to zależy od tego, co umieszczasz w układzie niestandardowym. Po prostu użyj 'android: background ="? Attr/selectableItemBackground "' na twoim image/imageButton, jeśli chcesz uzyskać prawdziwy efekt ripple – behelit

-2

należy wywołać metodę menu.add() i implemenet w menuPreareOptions zamiast metody oncreateoptionsmenu. To jest mój kod:

@Override 
    public boolean onPrepareOptionsMenu(Menu menu) {     

     menu.clear();  
     if(mAlbum.getStatus() == Album.STATUS_VIDEO_AVAILABLE) 
     { 
      menu.add(0, 0 , 0, getString(R.string.edit_album)) 
      .setIcon(R.drawable.edit_album_icon); 
      menu.add(0, 1 , 0, getString(R.string.delete_album)) 
      .setIcon(R.drawable.delete_album_icon); 
      menu.add(0, 2 , 0, getString(R.string.download_video)) 
      .setIcon(R.drawable.download_vdo_icon); 
      menu.add(0, 3 , 0, getString(R.string.upload_to_ambivo)) 
      .setIcon(R.drawable.share_ambivo_icon); 
      menu.add(0, 4 , 0, getString(R.string.upload_to_facebook)) 
      .setIcon(R.drawable.share_fb_icon); 
      menu.add(0, 5 , 0, getString(R.string.upload_to_youtube)) 
      .setIcon(R.drawable.share_yt_icon); 

     } 
     else{ 
      MenuInflater inflater = getMenuInflater(); 
      inflater.inflate(R.menu.albummenu, menu); 
      if(mAlbum.getAlbumType() == Album.COMPOSITE_VIDEOS) 
       menu.findItem(R.id.convert_album).setVisible(false); 
     } 

     return true; 
    } 
+0

Czy mógłbyś rozwinąć? zadzwoń do menu.add() gdzie? – Siavash

Powiązane problemy