2013-01-05 42 views
20

Tôi có thanh tác vụ hành động hủy và lưu.Bật/Tắt mục menu 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> 

Tôi muốn tắt tính năng lưu menuitem khi hoạt động được bắt đầu.

mã ngành của tôi -

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

     } 
    } 

Vì vậy, những gì tôi đang cố gắng để làm ở đây là, ban đầu khi hoạt động được bắt đầu tiết kiệm mục trình đơn nên bị vô hiệu và khi editext chứa một số văn bản sau đó nó phải được kích hoạt.

Tôi không chắc chắn nên là mã nào trong if else trong phương thức configureSaveButton. Ngoài ra làm thế nào tôi có thể vô hiệu hóa tiết kiệm mục trình đơn ban đầu.

Tôi nhận ngoại lệ con trỏ null trong onPrepareOptionsMenu.

Tôi đang sử dụng android 4,1

+0

hãy thử cách này cách tốt nhất để vô hiệu hóa biểu tượng mục menu http://stackoverflow.com/a/33910273/4449159 –

Trả lời

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

} 

Chỉ cần thổi phồng nó lên chuẩn bị thời gian và vô hiệu hóa sau khi đơn thổi phồng không cần phải inflate trong oncreateoptionemenu thời gian hoặc bạn chỉ có thể sử dụng hai dòng cuối cùng của mã sau khi lạm phát từ 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

Bạn cũng cần gọi 'invalidateOptionsMenu()' khi bạn muốn cập nhật nó. – dmon

+0

Có @dmon bạn đã đúng – Pratik

+0

Cảm ơn bạn đã trả lời cách tôi có thể kích hoạt lại nó? những gì cần được mã trong phương pháp configureSaveButton. – Coder

13

Tôi tìm thấy bài đăng này vì tôi muốn đạt được kết quả tương tự. Không có câu trả lời nào khác hoàn toàn hữu ích khi làm việc này cho tôi. Sau khi một số nghiên cứu và thử nghiệm và lỗi tôi đã nhận tôi làm việc. Vì vậy, tôi quyết định chia sẻ kết quả của mình.

biến tôi đã tạo cho nhiệm vụ này:

MenuItem save_btn; 
boolean b = false;` 

Sau đó thiết lập Actionbar Menu:

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

Kể từ khi biến boolean b được khởi tạo như sai các save_btn bị vô hiệu hóa khi hoạt động này được tạo ra.

Dưới đây là phương pháp để chuyển save_btn sử dụng @OpenSourceRulzz dụ:

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

Phương pháp này được gọi là thông qua các TextWatcher() chức năng cho EditText hộp trong onCreate() một lần nữa sử dụng @OpenSourceRulzz dụ

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

Phần cuối cùng của câu đố là thêm phương thức invalidateOptionsMenu().

Phần tôi đã tạo ra công việc của tôi đã sử dụng biến số boolean b để chuyển đổi trạng thái của save_btn.

1

Sau khi gặp khó khăn trong 1 giờ sau khi vấn đề ngu ngốc này, giải pháp duy nhất mà làm việc đối với tôi là:

cửa hàng Menu trong một biến địa phương:

Menu menu; 

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

Sau đó, thay đổi trạng thái kích hoạt đơn giản bằng cách gọi:

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

Và ban đầu bạn có thể vô hiệu hóa nó chỉ trong 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); 
} 

Với phương pháp này, mục menu của bạn sẽ bị tắt mỗi khi tình trạng của bạn được kiểm tra và sẽ được bật nếu không.

Các vấn đề liên quan