0

私が達成しようとしているのは、EditText が空の場合、Action Menu の MenuItem を無効にする必要があることです。onCreateOptionsMenu メソッドでメニューを膨らませてから、onPrepareOptionsMenu メソッドで [送信] ボタンを無効にし、Menu への参照を保存して、onCreate メソッドで設定された TextWatcher で使用できるようにします。

Menu myMenu;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_new_task);

    // Set up TextWatcher
    EditText ed = (EditText) findViewById(R.id.new_task_title);
    ed.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            Log.d("MYLOG", "This is onTextChanged event");

            if (s == null || s.length() == 0) {
                myMenu.findItem(R.id.action_send).setEnabled(false);
            }
            else {
                myMenu.findItem(R.id.action_send).setEnabled(true);
            }
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            Log.d("MYLOG", "This is beforeTextChanged event");
        }

        @Override
        public void afterTextChanged(Editable s) {
            Log.d("MYLOG", "This is afterTextChanged event");
        }
    });

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.new_task, menu);

    Log.d("MYLOG", "This is onCreateOptionsMenu event");
    return true;
}

@Override
public boolean onPrepareOptionsMenu(Menu menu) {

    Log.d("MYLOG", "This is onPrepareOptionsMenu event");

    // Save reference to the menu
    myMenu = menu;

    // Disable Send Button
    myMenu.findItem(R.id.action_send).setEnabled(false);

    return true;
}

このコードは問題なく動作し、画面の向きが変更されるまで、本来の動作を正確に実行します。これが発生すると、アクティビティが破棄され、再度作成されることを理解しています。問題は、アクティビティが再作成されると、ユーザーがテキストを変更したかのようにonTextChangedbeforeTextChanged、およびafterTextChangedメソッドが呼び出されることです (ユーザーは変更していません)。さらに、これら 3 つのメソッドはすべてonCreateOptionsMenuおよびonPrepareOptionsMenuメソッドが呼び出されるに呼び出されます。これは基本的にonTextChangedでその時点でも存在しないメニュー オブジェクトにアクセスしようとしています。もちろん、その結果、null ポインター例外が発生し、アプリケーションがクラッシュします。

この動作を説明するために、画面の向きが変更されたときに CatLog がどのように見えるかを次に示します。

11-06 11:55:39.142: D/MYLOG(32527): This is beforeTextChanged event
11-06 11:55:39.147: D/MYLOG(32527): This is onTextChanged event
11-06 11:55:39.147: D/MYLOG(32527): This is afterTextChanged event
11-06 11:55:39.207: D/MYLOG(32527): This is onCreateOptionsMenu event
11-06 11:55:39.207: D/MYLOG(32527): This is onPrepareOptionsMenu event
11-06 11:55:39.232: D/MYLOG(32527): This is onPrepareOptionsMenu event

私の質問は、ここで何か不足していますか? 私が達成しようとしていることに対する他のより良いアプローチはありますか? または、画面の向きが変わったときに Android が onTextChanged を呼び出さないようにする方法はありますか?

4

1 に答える 1