弹出菜单不会更改其选定状态

时间:2014-08-02 19:50:21

标签: android popupmenu

我这里有这个代码,当用户长按" edit_text"时,我创建了一个弹出菜单。视图的区域显示弹出菜单,其中包含"红色" "黄色"单选按钮选项可以更改" text_view"的背景​​颜色,但是我不知道为什么当我选择其他选项时,例如当前选择了红色时,我选择黄色,反之亦然(我选择了红色选项作为默认状态),所选状态根本不会改变,无论我按黄色多少次,仍然会选择红色。你能帮帮我吗?非常感谢你。

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

1 个答案:

答案 0 :(得分:0)

您的代码看起来存在一些逻辑问题。基于documentation

  

选择可检查项目时,系统会调用您的相应项目   项目选择的回调方法(例如onOptionsItemSelected())。它是   在这里你必须设置复选框的状态,因为一个复选框   或单选按钮不会自动更改其状态。

很容易发现每次都会调用你的onLongClick(View v),因此每次长按一次都会创建菜单(初始项目状态)。要解决此问题,您可以在此处存储已选中/未选中状态(或当前颜色),并在onLongClick(View v)中每次都正确设置项状态。如下所示:

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,这为创建长按上下文菜单提供了更方便的方法。请注意,来自onCreateContextMenu()ContextMenu文档明确指出每次都应该由应用填充适当状态的菜单:

  

即将显示视图的上下文菜单时调用。不像   onCreateOptionsMenu(Menu),每次上下文都会调用它   菜单即将显示,应填入视图(或   在AdapterView子类的视图中的项目,可以在中找到   menuInfo))。