这里有一段代码,当用户长时间按下"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;
}发布于 2014-08-08 05:41:20
看起来你的代码有逻辑上的问题。基于文档
当选中可校验项时,系统将调用相应的项选择回调方法(例如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,它为创建长点击上下文菜单提供了稍微更方便的方法。请注意,来自ContextMenu的onCreateContextMenu()文档清楚地表明,每次应用程序都应该填充处于适当状态的菜单:
当视图的上下文菜单即将显示时调用。与onCreateOptionsMenu(菜单)不同,每次显示上下文菜单时都会调用它,并且应该填充视图(或者AdapterView子类视图中的项,这可以在menuInfo中找到)。
https://stackoverflow.com/questions/25098797
复制相似问题