it-swarm.com.ru

Включить/отключить пункт меню ActionBar

У меня есть пункты меню 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>

Я хочу отключить сохранение меню, когда работа началась.

Мой код активности -

@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 содержит какой-то текст, его следует включить. 

Я не уверен, что должен быть код, если еще в методе configureSaveButton . Также, как я могу отключить сохранить пункт меню изначально.

Я получаю исключение нулевого указателя в onPrepareOptionsMenu.

Я использую Android 4.1

24
Coder
@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);

}
28
Pratik

Я нашел этот пост, потому что хотел достичь того же результата. Ни один из других ответов не помог мне в этом. После некоторых исследований, проб и ошибок я получил свою работу. Поэтому я решил поделиться своими результатами.

Переменные, которые я создал для этой задачи:

MenuItem save_btn;
boolean b = false;`

Затем настройте меню панели действий:

    @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 инициализируется как false, 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.

14
mjwheat

После 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 ...

2
Francesco Gabbrielli
@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);
}

При использовании этого метода ваш пункт меню будет отключен каждый раз, когда проверяется ваше состояние, и будет включен, если нет.

0
Alain Delgrange