アクションバーのメニュー項目をキャンセルして保存します。
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でnullポインタ例外が発生します。
私はAndroid 4.1を使用しています
@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
から膨らませた後の最後の2行のコードを使用できます。
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
menu.getItem(0).setEnabled(false); // here pass the index of save menu item
return super.onPrepareOptionsMenu(menu);
}
同じ結果を達成したかったので、この投稿を見つけました。他の答えはどれもこれを私のために機能させるのに完全に役立ちませんでした。いくつかの調査と試行錯誤の後、私は私の仕事に就きました。そこで、結果を共有することにしました。
このタスクのために作成した変数:
_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
_は無効になります。
@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の例を使用して、TextWatcher()
のEditText
ボックスのonCreate()
関数を介して再度呼び出されます。
_@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時間苦労した後、私のために働いた唯一の解決策は次のとおりです。
メニューをローカル変数に保存します。
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でそれを無効にすることができます...
@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);
}
この方法では、条件がチェックされるたびにメニュー項目が無効になり、そうでない場合は有効になります。