首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >弹出菜单不会更改所选状态

弹出菜单不会更改所选状态
EN

Stack Overflow用户
提问于 2014-08-02 19:50:21
回答 1查看 1.7K关注 0票数 0

这里有一段代码,当用户长时间按下"edit_text“视图的区域时,我创建了一个弹出菜单,该区域显示带有”红色“”黄色“单选按钮选项的弹出菜单,该选项改变了"text_view”的背景色,但我不知道为什么当我选择另一个选项时,比如当前选择红色时,我选择黄色,相反的情况(我选择了红色选项作为默认状态),所选状态根本不改变,无论我按黄色多少次,红色仍然被选中。你们能帮帮我吗?非常感谢。

代码语言:javascript
复制
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    edit_text = (EditText)findViewById(R.id.edit_text_1);
    text_view = (TextView)findViewById(R.id.textView1);

    //==========_CREATE A POPUP MENU WHEN LONG-CLICK ON EDITTEXT AREA_==========\\

    edit_text.setOnLongClickListener(new OnLongClickListener() {
        public boolean onLongClick(View v) {
            final PopupMenu pop_up = new PopupMenu(getContext(), v);

            getMenuInflater().inflate(R.menu.main, pop_up.getMenu());

            //GROUP'S ID IS "group".
            pop_up.getMenu().setGroupCheckable(R.id.group, true, true);

            pop_up.show();

            pop_up.setOnMenuItemClickListener(listener);
            return true;
        }
    });


}   
OnMenuItemClickListener listener = new OnMenuItemClickListener() {
    public boolean onMenuItemClick(MenuItem item) {
        switch(item.getItemId()) {

        case R.id.red:
            text_view.setBackgroundColor(Color.RED);
            if (!item.isChecked()) {

                item.setChecked(true);
            }
            return true;

        case R.id.yellow:
            text_view.setBackgroundColor(Color.YELLOW);
            if (!item.isChecked()) {

                item.setChecked(true);
            }
            return true;

        default:
            return false;
        }
    }
};
protected Context getContext() {
    return this;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-08 05:41:20

看起来你的代码有逻辑上的问题。基于文档

当选中可校验项时,系统将调用相应的项选择回调方法(例如onOptionsItemSelected())。在这里,您必须设置复选框的状态,因为复选框或单选按钮不会自动更改其状态。

很容易观察到,您的onLongClick(View v)每次都会被调用,因此每次长时间单击(带有初始项状态)时都会创建菜单。要解决这个问题,您可以将选中/未选中状态(或当前颜色)存储在其中,并在每次onLongClick(View v)中正确设置项状态。如下所示:

代码语言:javascript
复制
public class MainActivity extends ActionBarActivity {

    private static final String TAG = "MainActivity";

    private TextView mText;
    // For persistent storage SharedPreferences should be used instead of local variable
    private int mColor = Color.RED;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final EditText edit = (EditText) findViewById(R.id.edit_text_1);

        mText = (TextView)findViewById(R.id.textView1);
        mText.setBackgroundColor(mColor);

        edit.setOnLongClickListener(new OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                Log.d(TAG, "onLongClick");
                final PopupMenu pop_up = new PopupMenu(MainActivity.this, v);
                final Menu menu = pop_up.getMenu();

                getMenuInflater().inflate(R.menu.popup_menu, menu);

                //GROUP'S ID IS "group".
                menu.setGroupCheckable(R.id.group, true, true);

                pop_up.show();

                switch(mColor) {
                    case Color.RED:
                        menu.findItem(R.id.yellow).setChecked(false);
                        menu.findItem(R.id.red).setChecked(true);
                        break;

                    case Color.YELLOW:
                        menu.findItem(R.id.red).setChecked(false);
                        menu.findItem(R.id.yellow).setChecked(true);
                        break;

                    default:
                        break;
                }

                pop_up.setOnMenuItemClickListener(mMenuItemClickListener);
                return true;
            }
        });
    }

    final OnMenuItemClickListener mMenuItemClickListener = new OnMenuItemClickListener() {
        @Override
        public boolean onMenuItemClick(MenuItem item) {
            switch(item.getItemId()) {
                case R.id.red:
                    mText.setBackgroundColor(Color.RED);
                    mColor = Color.RED;
                    return true;

                case R.id.yellow:
                    mText.setBackgroundColor(Color.YELLOW);
                    mColor = Color.YELLOW;
                    return true;

                default:
                    return false;
            }
        }
    };

另外,我建议签出ContextMenu,它为创建长点击上下文菜单提供了稍微更方便的方法。请注意,来自ContextMenuonCreateContextMenu()文档清楚地表明,每次应用程序都应该填充处于适当状态的菜单:

当视图的上下文菜单即将显示时调用。与onCreateOptionsMenu(菜单)不同,每次显示上下文菜单时都会调用它,并且应该填充视图(或者AdapterView子类视图中的项,这可以在menuInfo中找到)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25098797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档