2014-10-02 16 views
12

tôi đặt một cái nhìn tùy chỉnh cho một trong actionbar thanh menu của tôi như thế nàyonOptionsItemSelected không nhận được gọi khi sử dụng xem hành động tùy chỉnh

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

nhưng khi tôi chạm vào mục menu trong ứng dụng của tôi, onOptionsItemSelected() không được gọi. (Tôi đã xác minh điều này thông qua việc thiết lập một điểm ngắt ở đầu phương thức). Nếu tôi chạm vào các nút khác, trong thanh Hành động, onOptionsItemSelected() sẽ được gọi.

đây là mã xml fo rmy xem tùy chỉnh:

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

Tôi cũng đã cố gắng thiết lập các điểm hành động trên menu file xml:

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

Lưu ý: Tôi biết tôi có thể làm hình ảnh có thể nhấp và đặt thủ công onClickListener cho nó, nhưng vì lợi ích của việc học, tôi muốn tìm hiểu phần cuối của điều này.

+0

Và phương thức 'onOptionsItemSelected()' của bạn như thế nào? – Sajmon

+0

nó không quan trọng, tôi có một breakpoint đặt ở đầu của phương pháp, và nó không được gọi là ở tất cả. – Siavash

+0

Bạn đã thử phương thức 'setActionView', chấp nhận ID tài nguyên thay vì chế độ xem, bạn có tăng cường thủ công không? –

Trả lời

23

Dường như mã cơ bản mà thổi phồng và lôi kéo các mục hành động, không kết nối nội dung của cách bố trí tùy chỉnh bằng setActionView() hoặc do android:actionLayout="@layout/image_container".

Có lẽ vì bố cục có thể là bất kỳ thứ gì và chỉ cần một nút hoặc hình ảnh. Vì vậy, tôi phải tự đặt onClickListener cho biểu tượng. Với mục đích tổ chức, tôi chỉ gọi onOptionsItemSelected() từ phương thức OnClick của biểu tượng của tôi, nhưng tôi chỉ có thể xác định hành động bên trong phương thức onClick.

trước, khai báo bộ lọcMenuItem trong số Activity của bạn.

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

Trong phương thức onClick bạn nên gọi onMenuItemSelected (0, filterMenuItem); thay vào đó, nếu bạn muốn truyền bá các cuộc gọi đến onOptionsItemSelected thông qua việc triển khai trong các phần của hoạt động của bạn. – Piaf

+1

Sử dụng actionlayout làm cho mục của tôi không phản hồi với gợn khi nhấp, là hành vi mặc định này? –

+2

Có, nó phụ thuộc vào những gì bạn đang đặt trong bố cục tùy chỉnh. Chỉ cần sử dụng 'android: background ="? Attr/selectableItemBackground "' trên hình ảnh/imageButton của bạn nếu bạn muốn hiệu ứng gợn sóng – behelit

-2

bạn phải gọi phương thức menu.add() và implemenet onPreareOptionsmenu thay vì phương thức oncreateoptionsmenu. Đây là mã của tôi:

@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

Bạn có thể vui lòng xây dựng? gọi menu.add() ở đâu? – Siavash

Các vấn đề liên quan