Java EditText不为空时启用操作菜单项

Java EditText不为空时启用操作菜单项,java,android,android-actionbar,menuitem,screen-orientation,Java,Android,Android Actionbar,Menuitem,Screen Orientation,我试图做到的是,当我的EditText为空时,应该禁用MenuItem in Action菜单。我在OnCreateOptions菜单方法中打开菜单,然后在OnPrepareOptions菜单方法中禁用Send按钮并保存对菜单的引用,以便在onCreate方法中设置的TextWatcher中使用它 Menu myMenu; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(save

我试图做到的是,当我的EditText为空时,应该禁用MenuItem in Action菜单。我在OnCreateOptions菜单方法中打开菜单,然后在OnPrepareOptions菜单方法中禁用Send按钮并保存对菜单的引用,以便在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;
}
此代码工作正常,在更改屏幕方向之前,它完全执行它应该执行的操作。我理解,当这种情况发生时,活动将被销毁并再次创建。问题是,在重新创建活动时,调用onTextChangedbeforeTextChangedbeforeTextChanged方法,就好像用户更改了文本一样(他没有更改)此外,在调用OnCreateOptions菜单OnPrepareOptions菜单方法之前,这三个方法都被调用,这基本上意味着在ContextChanged中,我试图访问当时甚至不存在的菜单对象。当然,这会导致空指针异常和应用程序崩溃

为了说明这种行为,下面是更改屏幕方向时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在屏幕方向改变时不调用ContextChanged吗?

如果使用为横向模式定义的布局更改方向,应用程序的行为是什么?
尝试在/res文件夹下创建布局区域文件夹,并将布局文件复制粘贴到该文件夹中

@Jakkub00:boolean标志在开始时设置为false,只有在菜单充气时才设置为true。在侦听器中,检查标志,然后执行mymenu.finditemstatement@Jakkub00当前位置你能找到解决问题的方法吗?如果没有,请参考下面的链接