2013-01-05 14 views
20

Mam menu paska zadań, anuluj i zapisz.Włącz/wyłącz menu ActionBar Pozycja

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> 

Chcę wyłączyć zapisać menuitem gdy działalność jest uruchomiony.

Mój kod aktywność -

@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{ 

     } 
    } 

Więc co usiłuję zrobić tutaj jest, gdy początkowo działalność rozpoczęła Zapisz menu powinno być wyłączone, a gdy editext zawiera jakiś tekst to powinno być włączone.

Nie jestem pewien, jaki powinien być kod, jeśli jeszcze w metodzie configureSaveButton. Również jak mogę wyłączyć zapisywanie pozycji menu początkowo.

Otrzymuję wyjątek wskaźnika pustego w onPrepareOptionsMenu.

Używam Android 4.1

+0

Wypróbuj ten jeden najlepszy sposób na wyłączenie ikony pozycji menu http://stackoverflow.com/a/33910273/4449159 –

Odpowiedz

25
@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); 

} 

Wystarczy nadmuchać go na czas i przygotować się wyłączyć po zawyżonej menu ma potrzeby inflate w oncreateoptionemenu czasie lub można po prostu użyć dwóch ostatnich linii kodu po pompowania z onCreateOptionMenu.

@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 

    menu.getItem(0).setEnabled(false); // here pass the index of save menu item 
    return super.onPrepareOptionsMenu(menu); 

} 
+10

Musisz również wywołać 'invalidateOptionsMenu()', gdy chcesz ją zaktualizować. – dmon

+0

Tak @dmon miałeś rację – Pratik

+0

Dzięki za odpowiedź, w jaki sposób mogę ponownie włączyć tę funkcję? jaki powinien być kod w metodzie configureSaveButton. – Coder

13

Znalazłem ten post, ponieważ chciałem osiągnąć ten sam rezultat. Żadna z pozostałych odpowiedzi nie była w pełni pomocna w uzyskaniu tego dla mnie. Po kilku badaniach i próbach i błędach dostałem moje do pracy. Dlatego postanowiłem podzielić się wynikami.

Zmienne I stworzone do tego zadania:

MenuItem save_btn; 
boolean b = false;` 

Następnie skonfigurować menu 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; 
} 

Od zmiennej boolean b jest inicjowany jako false save_btn jest wyłączona, gdy działalność jest tworzony.

Oto sposób, aby włączyć save_btn pomocą @OpenSourceRulzz przykład:

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; 
    } 
} 

Metoda ta nazywana jest przez funkcję TextWatcher() na pole w onCreate()EditText ponownie stosując @OpenSourceRulzz Przykład

@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) {} 
    }); 
} 

Ostatnim elementem układanki było dodanie metody invalidateOptionsMenu().

Części, które wymyśliłem, sprawiły, że moja praca polegała na użyciu zmiennej boolean b, aby przełączyć stan save_btn.

1

Po zmaga się przez 1 godzinę po tym głupim problemu, jedynym rozwiązaniem, które pracował dla mnie jest:

sklep Menu w zmiennej lokalnej:

Menu menu; 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    this.menu = menu; 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    return true; 
} 

następnie zmienić stan aktywowany po prostu przez wywołanie:

menu.findItem(R.id.action_save).setEnabled(true); 

I można go wyłączyć początkowo tylko w xml ...

0
@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); 
} 

Dzięki tej metodzie pozycja menu zostanie wyłączona za każdym razem, gdy zostanie sprawdzony stan i zostanie włączona, jeśli nie.

Powiązane problemy