2013-01-05 147 views
20

我有操作欄menuitems取消並保存。啓用/禁用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方法中if應該是什麼代碼。 另外我怎麼能最初禁用保存菜單項。

我在onPrepareOptionsMenu中得到空指針異常。

我使用的是Android 4.1

+0

試試這個 禁用菜單項圖標的最佳方法http://stackoverflow.com/a/33910273/4449159 –

回答

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

} 

只是誇大它的準備時間和oncreateoptionemenu時間膨脹的菜單後,禁用不需要inflate或者你可以用最後兩行代碼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

當您需要更新時,您還需要調用'invalidateOptionsMenu()'。 – dmon

+0

是@dmon你是對的 – Pratik

+0

謝謝你的答案我怎麼能再次啓用它? configureSaveButton方法中的代碼應該是什麼。 – Coder

13

我發現這篇文章,因爲我想達到相同的結果。沒有其他答案完全有助於爲我工作。經過一些研究和試驗和錯誤,我得到了我的工作。所以我決定分享我的結果。

變量我爲這個任務創建:

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被初始化爲假創建活動時save_btn被禁用。

下面是使用@OpenSourceRulzz例子來切換save_btn的方法:

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()功能要求在onCreate()EditText框再次使用@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的狀態。

1

後,這個愚蠢的問題搏鬥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 ...

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

使用此方法,每次檢查條件時,菜單項都將被禁用,如果沒有,則將啓用。