2014-10-02 8 views
12

ich mit einem meiner ActionBar MenuBar wie dieseonOptionsItemSelected nicht genannt wurden, wenn benutzerdefinierte Aktion Ansicht

@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); 
     ... 

eine benutzerdefinierte Ansicht gesetzt, aber wenn ich diesen Menüpunkt in meiner App tippen, wird onOptionsItemSelected() nicht aufgerufen. (Ich habe dies überprüft, indem ich einen Breakpoint am Anfang der Methode gesetzt habe). Wenn ich auf die anderen Schaltflächen tippe, wird in der Aktionsleiste onOptionsItemSelected() aufgerufen.

hier ist der XML-Code fo rmy benutzerdefinierte Ansicht:

<?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"/> 

ich auch die Aktion Ansicht Einstellung im Menü XML-Datei versucht haben:

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

Hinweis: Ich weiß, dass ich machen kann das Bild anklickbar, und manuell ein onClickListener für es, aber aus Gründen des Lernens, möchte ich auf den Grund davon zu kommen.

+0

Und wie sieht Ihre 'onOptionsSetelected()' Methode aus? – Sajmon

+0

ist es egal, ich habe einen Breakpoint am Anfang der Methode gesetzt, und es wird überhaupt nicht aufgerufen. – Siavash

+0

Haben Sie versucht, die 'setActionView'-Methode, die Ressourcen-ID anstelle der Ansicht akzeptiert, manuell aufzublasen? –

Antwort

23

Es scheint, dass der zugrunde liegende Code, der die Aktionselemente aufbläst und zieht, nicht den Inhalt des benutzerdefinierten Layout von setActionView() oder durch die android:actionLayout="@layout/image_container" gesetzt verbinden.

Wahrscheinlich, weil das Layout alles sein kann, und nur eine Schaltfläche oder ein Bild. Also muss ich das onClickListener für das Symbol manuell festlegen. Für den Zweck der Organisation, ich rufe nur onOptionsItemSelected() von der OnClick Methode meines Symbols, aber ich könnte nur die Aktion innerhalb der onClick Methode definieren.

zuerst deklarieren Sie filterMenuItem in Ihrem 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

In onClick-Methode sollten Sie OnMenuItemSelected aufrufen (0, filterMenuItem); Stattdessen, wenn Sie Aufrufe an onOptionsItemSelected über Implementierungen in Fragmenten Ihrer Aktivität weitergeben möchten. – Piaf

+1

Die Verwendung von Actionlayout bewirkt, dass mein Objekt nicht mit Ripple beim Klicken reagiert. Ist das Standardverhalten? –

+2

Ja, es hängt davon ab, was Sie in das benutzerdefinierte Layout einfügen. Verwenden Sie einfach 'android: background ="? Attr/selectableItemBackground "' auf Ihrem Bild/imageButton, wenn Sie möchten, dass der Ripple-Effekt – behelit

-2

müssen Sie die Methode menu.add() und implemenet onPreareOptions anstelle der Methode oncreateoptionsmenu aufrufen. Dies ist mein Code:

@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

Können Sie bitte ausarbeiten? ruf menu.add() wo? – Siavash

Verwandte Themen