12

Tôi có một trình đơn được thổi phồng từ main_menu.xml:OnMenuItemSelected không được gọi khi bố trí được thiết lập cho mục menu

<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item 
     android:id="@+id/act_sync" 
     android:showAsAction="always" 
     android:actionLayout="@layout/sync_action" 
     android:icon="@android:drawable/ic_popup_sync" /> 
</menu> 

và đây là mã trong hoạt động:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.main_menu, menu); 
    return true; 
} 
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    MyMessageHandler.debug("menu item selected"); 
    switch(item.getItemId()){ 
    case R.id.act_sync: 
     sync(); 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

Nhưng onOptionsItemSelected không được gọi khi tôi chạm vào mục menu. Khi tôi loại bỏ thuộc tính actionLayout của mục menu, nó hoạt động tốt. Làm thế nào tôi có thể sửa lỗi này?
Cảm ơn.

Trả lời

26

bạn nên sử dụng bên dưới đoạn (Chỉ để tham khảo)

@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.main_menu, menu); 
     final Menu m = menu; 
     final MenuItem item = menu.findItem(R.id.ActionConnection); 
     item.getActionView().setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       sync(); 
      } 
     }); 
     return true; 
    } 
+3

Cảm ơn. Tôi đã thử nghiệm 'item.setOnMenuItemClickListener' nhưng nó không hoạt động. Vấn đề là để có được chế độ xem tùy chỉnh của tôi và đặt clickListener trên đó. Cảm ơn sự giúp đỡ của bạn :) mặc dù, onClick() không nên được chú thích bởi @Override. Tôi chỉnh sửa câu trả lời của bạn cho phiên bản hoạt động, và cũng là một chút tiêu hóa hơn;) –

+0

cảm ơn Vipul :) – Ranjit

+0

Đây là giải pháp duy nhất có hiệu quả đối với tôi. Tôi đã thử setOnMenuItemClickListener, onMenuItemSelected, v.v. – crubio

21

Ngoài các câu trả lời được cung cấp bởi Vipul Shah.

Hãy chắc chắn rằng bạn vô hiệu hóa tùy chọn nhấp được tất cả các mục trong cách bố trí hành động của bạn:

android:clickable="false" 

Nếu không, nó có thể ăn cắp các nhấp chuột để bạn vẫn không thể nhận onClick gọi lại.

+1

Số giờ tìm kiếm. Cảm ơn! –

+0

Đã cứu mạng tôi ...! Nếu không có câu trả lời này sẽ không hoạt động ... Cảm ơn! –

+0

Cảm ơn rất nhiều. Đã cứu tôi khỏi bị giết đau lưng :) –