Android可检查上下文菜单不记得已选中

时间:2012-03-21 12:39:27

标签: android contextmenu

我有一个按钮,可打开一个上下文菜单,其中包含各种选项列表。一次只能选择一个选项,所以我希望每个选项旁边都有一个单选按钮,突出显示当前选择的项目。当我从上下文菜单中选择一个项目时,单选按钮被选中并关闭。单击按钮打开上下文菜单后,未选择先前选择的项目。

如何让上下文菜单记住之前选择的项目?

其次,首次创建活动时,会选择默认选项。如何设置初始默认值,然后在选择另一个上下文菜单项时可以覆盖该默认值?我可以在XML中设置android:checked="true"但是当选择了不同的项目时可以覆盖它吗?

爪哇:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.browse);
    Button buttonView = (Button) this.findViewById(R.id.button_view);
    buttonView.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            registerForContextMenu(v);
            openContextMenu(v);
        }
    });
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    menu.setHeaderTitle(R.string.menu_title);
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.context_menu, menu);
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    switch(item.getItemId()) {
        case(R.id.item1):
            if(item.isChecked()) {
                item.setChecked(false);
            } else {
                item.setChecked(true);
            }
            break;
        case(R.id.item2):
            if(item.isChecked()) {
                item.setChecked(false);
            } else {
                item.setChecked(true);
            }
            break;
        case(R.id.item3):
            if(item.isChecked()) {
                item.setChecked(false);
            } else {
                item.setChecked(true);
            }
            break;
        default:
            return super.onContextItemSelected(item);
    }
    return true;
}

XML:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <group android:id="@+id/context_menu" android:checkableBehavior="single">
        <item android:id="@+id/item1"
            android:title="@string/context_menu_item1" />
        <item android:id="@+id/item2"
            android:title="@string/context_menu_item2" />
        <item android:id="@+id/item3"
            android:title="@string/context_menu_item3" />
    </group>
</menu>

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:15)

问题是您的项目不会在显示菜单之间保存状态。 因此,每次调用setChecked时,它仅适用于当前显示的菜单,并重置为下一个菜单。

您应该将检查状态保存在外部结构中,例如布尔数组。

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    menu.setHeaderTitle(R.string.menu_title);
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.context_menu, menu);

    // loop for menu items
    for (int i = 0; i < menu.size(); ++i) {
        MenuItem mi = menu.getItem(i);
        // check the Id as you wish
        if (mi.getItemId() == R.id.item2) {
            mi.setChecked(true); 
        }
    }
}

为了搜索菜单项,您还可以使用findItem函数:

MenuItem mi = menu.findItem(R.id.item2)

答案 1 :(得分:1)

好吧,你必须在某处保存你的用户输入,并在给布局膨胀后明确设置检查状态。

顺便说一句,您可以像这样编写您选择的项目开关:

switch (item.getItemID()) {
case R.id.item1:
case R.id.item2:
case R.id.item3:
   item.setChecked(!item.isChecked());
}