Android操作栏可检查菜单项无法正常工作/显示?

时间:2011-11-16 08:34:56

标签: android menu android-actionbar

所以我试图获取我的菜单项,即在操作栏上显示的行为就像一个可检查的菜单选项。第一部分工作,这意味着它是可检查的,当我按下它,并在代码中设置setChecked(true)它的工作原理。但是什么不起作用的是视觉部分。在已检查和未选中状态下,菜单项在操作栏上的显示方式没有变化?我尝试使用invalidateOptionsMenu(),但这不能完成这项工作,不仅如此,我的代码中的那行我无法退出检查状态?!? 发生的事情是,使OptionsMenu()接缝无效以取消设置已检查状态并最终“循环”,或者在每次按下该菜单项时,我会继续检查代码中未经检查的部分,并且无效,它将被取消选中我想......

以下是我的XML文件中的代码:

<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>

这是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);
}

谢谢!

3 个答案:

答案 0 :(得分:32)

  

可检查项目仅出现在子菜单或上下文菜单中。

您正在使用它们作为主菜单项,因此无法使用。

消息来源:下载API DEMOS,打开文件ApiDemos / res / menu / checkable.xml,你会在第13行看到它。我不知道他们为什么不要在开发者文档

中提到这一点

参考评论: http://alvinalexander.com/java/jwarehouse/android-examples/platforms/android-2/samples/ApiDemos/res/menu/checkable.xml.shtml

答案 1 :(得分:8)

或者自己动手

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

并在onOptionsItemSelected中执行:

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

答案 2 :(得分:4)

最佳解决方案是将actionLayout的{​​{1}}设置为<Item>。此解决方案为您提供了一个原生的复选框(带有素材动画等),其字体与其他项目相匹配,它既可以作为动作也可以在子菜单中使用。

  1. 创建名为CheckBox的新布局:
  2. action_checkbox.html
    1. 像这样设置<?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" /> 。请注意,您需要<Item>Checkable,以防它显示在子菜单中(在这种情况下,Checked会被忽略。
    2. actionLayout
      1. 在您的代码中,当创建菜单时,我们需要a)设置复选框的标题以匹配菜单项标题,b)恢复菜单可检查的选中状态和我们的额外复选框,以及c)为我们的额外复选框添加一个onClicked()侦听器。在此代码中,我将<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>
      2. 中的复选框的状态保持不变
        RetainedFragment