2013-01-05 18 views
20

アクションバーのメニューをキャンセルして保存します。私は活動が開始されたときにメニューアイテムを保存無効にしたい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でヌルポインタ例外を受け取ります。私は時間を準備する上で、それを膨らませるとoncreateoptionemenu時に膨張したメニュー後inflateへの必要性を無効にしないか、あなただけのonCreateOptionMenuから膨張させた後、コードの最後の2行を使用することができます

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

} 

アンドロイド4.1を使用しています

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

:変数boolean b以来

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

は、アクティビティが作成されたときに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; 
    } 
} 

この方法は、@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) {} 
    }); 
} 

を用いて再度onCreate()EditTextボックスのTextWatcher()関数を介して呼び出されますパズルの最後の部分は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); 
} 

この方法では、条件がチェックされるたびにメニュー項目が無効になり、そうでない場合は有効になります。

関連する問題