【问题标题】:Android checkable context menu not remembering checkedAndroid可检查上下文菜单不记得检查
【发布时间】:2017-03-08 21:01:05
【问题描述】:

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

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

其次,当第一次创建活动时,会选择默认选项。如何设置初始默认值,然后在选择另一个上下文菜单项时可以覆盖该默认值? I can set android:checked="true" in the XML but can this be overwritten when a different item is selected?

Java:

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

任何帮助将不胜感激!

【问题讨论】:

    标签: android contextmenu


    【解决方案1】:

    问题是您的项目没有保存菜单显示之间的状态。 所以每次调用 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)
    

    【讨论】:

    • 所以我在选择时存储用户输入。然后如何在下次打开上下文菜单时使用它来显示已选中的项目?
    • 我已经更新了答案。所以你应该使用 onCreateContextMenu 并在这里设置检查状态。
    【解决方案2】:

    好吧,您必须将用户输入保存在某处,并在扩展布局后明确设置检查状态。

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

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

    【讨论】:

    • 每个案例包含的不仅仅是这个,但我只是以此为例。为您的简化 setChecked() +1!如何获取用户输入?
    • item.isChecked() 是您的用户输入。顺便说一句,我认为 StackOverflow 会要求您提出一个新问题,如果这还不够回答...
    • @Bondax item.isChecked() 只是检查该项目是否已被检查......这不是用户输入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多