我这里有这个代码,当用户长按" 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;
}
答案 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))。