我在onCreate()方法中使用此代码验证活动的EditText:
final EditText editName = (EditText) findViewById(R.id.titleNameTextView);
editName.addTextChangedListener(
new TextWatcher() {
@Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override public void onTextChanged(CharSequence s, int start, int before, int count) {}
@Override public void afterTextChanged(Editable s) {
if(editName.getText().toString().length() < 3){
editName.setError("Error Text");
}
}
}
);
所以,如果我这样做:
Log.d("error", editName.getError().toString());
我收到了消息。
现在我想启用/禁用菜单项,具体取决于此editText是否有错误。我发现我可以用以下方法修改按钮的可用性:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_people_edit, menu);
menu.findItem(R.id.action_save).setEnabled(false);
return true;
}
问题是我在设置错误消息时无法禁用该按钮,因为我必须在onCreateOptionsMenu中修改它,并且验证是从onCreate方法进行的。
编辑:我添加了以下代码,但它无法正常工作
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
EditText name = (EditText) findViewById(R.id.titleNameTextView);
if(name.getText().toString().length() < 3){
menu.getItem(0).setEnabled(false);
}
return super.onPrepareOptionsMenu(menu);
}
答案 0 :(得分:2)
您必须致电invalidateOptionsMenu()
,或向后兼容的版本。它会调用onCreateOptionsMenu
。在那里,你可以检查你的状况,并做你需要的任何事情。
答案 1 :(得分:1)
在运行时更改菜单项
创建活动后,onCreateOptionsMenu()方法就是 如上所述,只召唤一次。系统保留并重新使用 您在此方法中定义的菜单,直到您的活动被销毁。如果 您想在首次创建后随时更改选项菜单, 你必须覆盖onPrepareOptionsMenu()方法。这传递给你 当前存在的Menu对象。如果你愿意,这很有用 删除,添加,禁用或启用菜单项取决于当前 申请状态。
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
menu.getItem(0).setEnabled(false);
return super.onPrepareOptionsMenu(menu);
}
答案 2 :(得分:0)
感谢一些答案,我是下一步做的
1-我添加了这个方法:
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
EditText name = (EditText) findViewById(R.id.titleNameTextView);
if(name.getText().toString().length() < 3){
menu.getItem(0).setEnabled(false);
}
return super.onPrepareOptionsMenu(menu);
}
2-当我设置错误时,我也会调用:
invalidateOptionsMenu()