2011-11-16 30 views
13

vì vậy tôi đang cố gắng để có được mục trình đơn của tôi, được hiển thị trên thanh hành động để hoạt động giống như một tùy chọn trình đơn có thể kiểm tra. Phần linh hoạt hoạt động, có nghĩa là nó có thể kiểm tra được và khi tôi nhấn nó, và thiết lập trong mã setChecked (true) nó hoạt động. Nhưng những gì không hoạt động là phần trực quan. Không có thay đổi về cách một mục trình đơn trông như thế nào trên thanh hành động trong các trạng thái được chọn và bỏ chọn? Tôi đã thử sử dụng invalidateOptionsMenu() nhưng điều đó không thực hiện công việc, và không chỉ vậy, với dòng đó trong mã của tôi, tôi không thể thoát khỏi trạng thái đã chọn?!? Điều gì xảy ra là các tùy chọn invalidMenu() không hợp lệ để bỏ đặt trạng thái đã chọn và tôi kết thúc 'vòng lặp' hoặc trên mỗi lần nhấn của mục trình đơn đó mà tôi tiếp tục đi đến phần không kiểm tra của mã mà nó được kiểm tra và không hợp lệ. kiểm soát tôi đoán ...mục menu có thể kiểm tra trên thanh tác vụ Android không hoạt động/hiển thị đúng cách?

đây là mã từ file XML của tôi cho menu:

<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:id="@+id/lenslist_menu_add" 
     android:showAsAction="always" 
     android:title="@string/add"/> 
    <item android:id="@+id/lenslist_menu_delete" 
     android:showAsAction="always" 
     android:checkable="true" 
     android:title="@string/delete"/> 
</menu> 

Và đây là đoạn code java:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // TODO Auto-generated method stub 
    switch (item.getItemId()) { 
    case R.id.lenslist_menu_add: 

     return true; 
    case R.id.lenslist_menu_delete: 
     if (item.isChecked() == true) { 
      item.setChecked(false); 
      deleteMode = false; 
      lensAdapter.setDeleteMode(false); 
     } else { 
      item.setChecked(true); 
      deleteMode = true; 
      lensAdapter.setDeleteMode(true); 
     } 
     lensAdapter.notifyDataSetChanged(); 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

Cảm ơn!

Trả lời

30

Các mục có thể kiểm tra chỉ xuất hiện trong menu con hoặc menu ngữ cảnh.

Bạn đang sử dụng chúng làm mục menu chính, do đó nó sẽ không hoạt động.

NGUỒN: Tải xuống API DEMOS và mở tệp ApiDemos/res/menu/checkable.xml, bạn sẽ thấy nó dưới dạng nhận xét trên dòng 13. Tôi không biết tại sao chúng không đề cập đến này tham khảo trong Tài liệu cho nhà phát triển

với bình luận .: http://alvinalexander.com/java/jwarehouse/android-examples/platforms/android-2/samples/ApiDemos/res/menu/checkable.xml.shtml

+0

đâu câu rằng từ đâu? –

+0

Bạn có thể tìm thấy dưới dạng nhận xét trong Api Demo: ApiDemos \ res \ menu \ checkable.xml, tôi không thể tìm thấy nó trong tài liệu dành cho nhà phát triển – Entreco

4

giải pháp tốt nhất là để thiết lập actionLayout của <Item> đến một CheckBox. Giải pháp này cung cấp cho bạn một hộp kiểm tìm kiếm bản địa (với các hình động vật liệu, vv), với một phông chữ phù hợp với các mục khác, và nó hoạt động như một hành động và trong menu con.

  1. Tạo một bố cục mới được gọi là action_checkbox.html:
<?xml version="1.0" encoding="utf-8"?> 
<CheckBox xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:paddingStart="8dp" 
      android:paddingEnd="8dp" 
      android:checked="false" 
      android:textAppearance="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Menu" 
      android:id="@+id/action_item_checkbox" 
    /> 
  1. Đặt bạn <Item> như thế này. Lưu ý rằng bạn cần CheckableChecked vẫn trong trường hợp nó được hiển thị trong một sub-menu (trong trường hợp này actionLayout được bỏ qua.
<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity"> 
    <item android:id="@+id/menu_action_logging" 
      android:title="@string/action_logging" 
      android:orderInCategory="100" 
      android:showAsAction="always" 
      android:checkable="true" 
      android:checked="false" 
      android:actionLayout="@layout/action_checkbox" 
     /> 
</menu> 
  1. Trong của bạn mã, khi menu được tạo, chúng ta cần a) đặt tiêu đề của hộp kiểm để khớp với tiêu đề của mục menu, b) khôi phục trạng thái đã chọn của cả menu có thể kiểm tra và hộp kiểm bổ sung của chúng tôi và c) thêm onClicked() người nghe cho hộp kiểm bổ sung của chúng tôi. Trong mã này, tôi kiên trì trạng thái của hộp kiểm trong một RetainedFragment.
// Set the check state of an actionbar item that has its actionLayout set to a layout 
    // containing a checkbox with the ID action_item_checkbox. 
    private void setActionBarCheckboxChecked(MenuItem it, boolean checked) 
    { 
     if (it == null) 
      return; 

     it.setChecked(checked); 

     // Since it is shown as an action, and not in the sub-menu we have to manually set the icon too. 
     CheckBox cb = (CheckBox)it.getActionView().findViewById(R.id.action_item_checkbox); 
     if (cb != null) 
      cb.setChecked(checked); 
    } 

    @Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) 
    { 
     inflater.inflate(R.menu.menu_main, menu); 
     super.onCreateOptionsMenu(menu, inflater); 

     // Restore the check state e.g. if the device has been rotated. 
     final MenuItem logItem = menu.findItem(R.id.menu_action_logging); 
     setActionBarCheckboxChecked(logItem, mRetainedFragment.getLoggingEnabled()); 

     CheckBox cb = (CheckBox)logItem.getActionView().findViewById(R.id.action_item_checkbox); 
     if (cb != null) 
     { 
      // Set the text to match the item. 
      cb.setText(logItem.getTitle()); 
      // Add the onClickListener because the CheckBox doesn't automatically trigger onOptionsItemSelected. 
      cb.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        onOptionsItemSelected(logItem); 
       } 
      }); 
     } 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.menu_action_logging: 
       // Toggle the checkbox. 
       setActionBarCheckboxChecked(item, !item.isChecked()); 

       // Do whatever you want to do when the checkbox is changed. 
       mRetainedFragment.setLoggingEnabled(item.isChecked()); 
       return true; 
      default: 
       break; 
     } 

     return false; 
    } 
+0

mRetainedFragment là gì? –

+0

Đó chỉ là những gì tôi muốn mã của tôi làm. Thay thế nó bằng bất cứ điều gì bạn muốn mã của bạn làm khi hộp kiểm được bật. – Timmmm

+0

Cảm ơn bạn. Tôi đã cố định bằng cách thêm bố cục tùy chỉnh trong thanh tác vụ. Làm việc hoàn hảo –

5

Hoặc chỉ cần tự mình làm

@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 
    menu.findItem(R.id.item1).setIcon(menu_checked?R.drawable.menu_ico_checked:R.drawable.menu_ico_unchecked); 
    return super.onPrepareOptionsMenu(menu); 
} 

và trong onOptionsItemSelected làm:

.... 
menu_checked=!menu_checked; 
invalidateOptionsMenu(); 
+0

Tôi sẽ bỏ phiếu cho bạn hàng nghìn lần nếu tôi có thể – Rasel

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