2014-10-02 51 views
12

當我設置的自定義視圖我動作條菜單欄的一個這樣的onOptionsItemSelected沒有得到所謂的使用自定義操作視圖

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

,但是當我點擊我的應用程序,菜單項,onOptionsItemSelected()不會被調用。 (我已經通過在方法開始處設置斷點來驗證這一點)。如果我點擊其他按鈕,在Action欄中,onOptionsItemSelected()會被調用。

這裏是XML代碼FO RMY自定義視圖:

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

我也試着設置菜單上的xml文件的操作觀點:

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

注:我知道我可以做圖片可點擊,併爲其手動設置onClickListener,但爲了學習,我想深入瞭解這一點。

+0

看起來你的'onOptionsItemSelected()'方法? – Sajmon 2014-10-02 22:11:41

+0

這沒關係,我在方法的開始處設置了一個斷點,它根本不會被調用。 – Siavash 2014-10-02 22:13:40

+0

你嘗試'setActionView'方法,它接受資源ID而不是視圖,你手動膨脹? – 2014-10-02 22:23:01

回答

23

似乎是膨脹,並提請行動項目的底層代碼,不連接通過setActionView()或由android:actionLayout="@layout/image_container"設置自定義佈局的內容。

可能因爲佈局可以是任何東西,只是一個按鈕或圖像。所以我必須手動設置圖標onClickListener。爲了組織的目的,我只是從我的圖標的OnClick方法中調用onOptionsItemSelected(),但我可以在onClick方法中定義動作。

首先,在您的Activity中聲明filterMenuItem。

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

在onClick方法中,您應該調用onMenuItemSelected(0,filterMenuItem);相反,如果你想通過你的活動片段的實現傳播對onOptionsItemSelected的調用。 – Piaf 2015-05-05 11:38:21

+1

使用actionlayout會使我的物品在點擊時沒有響應,這是默認行爲嗎? – 2016-03-16 23:25:01

+2

是的,這取決於你在自定義佈局中放置什麼。只需在你的image/imageButton上使用'android:background =「?attr/selectableItemBackground」'如果你想讓漣漪效應 – behelit 2016-06-07 23:57:49

-2

你必須調用menu.add()方法並在onPreareOptionsmenu上實現而不是oncreateoptionsmenu方法。這是我的代碼:

@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

您能否詳細說明一下?調用menu.add()在哪裏? – Siavash 2014-10-02 23:40:35

相關問題