Включение/выключение пункта меню ActionBar
У меня есть элементы меню действий отменить и сохранить.
menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@+id/saveButton"
android:showAsAction="always"
android:title="@string/save"
android:visible="true">
</item>
<item android:id="@+id/cancelButton"
android:showAsAction="always"
android:title="@string/cancel"
android:visible="true">
</item>
</menu>
Я хочу отключить save menuitem, когда действие запущено.
Код моей активности -
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.add_project);
EditText projectName = (EditText) findViewById(R.id.editTextProjectName);
projectName.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
configureSaveButton(s);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,int after) {}
@Override
public void afterTextChanged(Editable s) {}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.addprojectmenu, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
MenuItem item = (MenuItem) findViewById(R.id.saveButton);
item.setEnabled(false);
return super.onPrepareOptionsMenu(menu);
}
private void configureSaveButton(CharSequence s){
String text = null;
if(s != null){
text = s.toString();
}
if(text != null && text.trim().length() != 0){
}else{
}
}
Итак, что я пытаюсь сделать здесь, изначально, когда активность запускается, элемент меню сохранения должен быть отключен, а когда editext содержит текст, он должен быть включен.
Я не уверен, какой должен быть код в if else в методе configureSaveButton.
Также как я могу сначала отключить пункт меню сохранения.
Я получаю исключение null-указателя в onPrepareOptionsMenu.
Я использую android 4.1
Ответы
Ответ 1
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.addprojectmenu, menu);
menu.getItem(0).setEnabled(false); // here pass the index of save menu item
return super.onPrepareOptionsMenu(menu);
}
Просто надуть его на время подготовки и отключить после раздутого меню, не нужно inflate
в oncreateoptionemenu
, или вы можете просто использовать последние две строки кода после раздувания от onCreateOptionMenu
.
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
menu.getItem(0).setEnabled(false); // here pass the index of save menu item
return super.onPrepareOptionsMenu(menu);
}
Ответ 2
Я нашел этот пост, потому что хотел достичь того же результата. Ни один из других ответов не был полностью полезен для того, чтобы заставить меня работать на меня. После некоторых исследований и испытаний и ошибок я получил работу. Поэтому я решил поделиться своими результатами.
Переменные, которые я создал для этой задачи:
MenuItem save_btn;
boolean b = false;`
Затем настройте меню Actionbar:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.update_menu_item, menu);
save_btn = (MenuItem) menu.findItem(R.id.action_save);
return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu){
save_btn.setEnabled(b);
super.onPrepareOptionsMenu(menu);
return true;
}
Поскольку переменная boolean b
инициализируется как ложная, save_btn
отключается, когда создается действие.
Вот способ переключения save_btn
с помощью примера @OpenSourceRulzz:
private void updateSaveButton (CharSequence s){
String text = null;
if(s != null){
text = s.toString();
}
if(text != null && text.trim().length() != 0){
b = true;
}
else{
b = false;
}
}
Этот метод вызывается через функцию TextWatcher()
для окна EditText
в onCreate()
снова, используя пример @OpenSourceRulzz
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.add_project);
EditText projectName = (EditText) findViewById(R.id.editTextProjectName);
projectName.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
updateSaveButton(s);
invalidateOptionsMenu();
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,int after){}
@Override
public void afterTextChanged(Editable s) {}
});
}
Последняя часть головоломки добавляла метод invalidateOptionsMenu()
.
Часть, с которой я столкнулся с этой работой, использовала переменную boolean b
для переключения состояния save_btn
.
Ответ 3
После битвы в течение 1 часа после этой глупой проблемы единственным решением, которое сработало для меня, является:
сохранить меню в локальной переменной:
Menu menu;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
this.menu = menu;
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
Затем измените статус включения, просто позвонив:
menu.findItem(R.id.action_save).setEnabled(true);
И вы можете сначала отключить его только в xml...
Ответ 4
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
if (your condition) {
menu.findItem(R.id.saveButton).setEnabled(false);
} else {
menu.findItem(R;id.saveButton).setEnabled(true);
}
return super.onPrepareOptionsMenu(menu);
}
С помощью этого метода ваш пункт меню будет отключен каждый раз, когда ваше условие будет проверено, и будет включено, если нет.