当前位置: 首页 > 知识库问答 >
问题:

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

赵宏达
2023-03-14

我试图实现的是,当我的EditText为空时,操作菜单中的MenuItem应该被禁用。我在onCreateOptionsMenu方法中展开菜单,然后禁用onPrepareOptionsMenu方法中的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;
}

这段代码工作正常,在屏幕方向改变之前,它会做它应该做的事情。我知道当这种情况发生时,活动会被销毁并再次创建。问题是,当活动被重新创建时,onTextChanged、beforeTextChanged和postTextChanged方法会被调用,就好像用户更改了文本一样(他没有)。此外,所有这三个方法都在调用onCreateOptionsMenu和onPresareOptionsMenu方法之前被调用,这基本上意味着在onTextChanged中,我试图访问当时甚至不存在的菜单对象。这当然会导致空指针异常和应用程序崩溃。

为了说明此行为,下面是屏幕方向更改时 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?

共有1个答案

拓拔迪
2023-03-14

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

 类似资料:
  • 我已经为消息创建了一个操作栏项,当收到新消息时,它应该被更新。问题是,当我刷新活动时,它有时会将图标显示为新消息,有时则不会显示新消息。这是随机发生的。它没有正确更新。我检查了如何更新ActionBar中显示的菜单项? 但无法解决我的问题。我意识到问题是onCreateOptionMenu在oncreate时执行。我如何延迟?

  • ActionSheet 操作菜单 平台差异说明 App H5 微信小程序 支付宝小程序 百度小程序 头条小程序 QQ小程序 √ √ √ √ √ √ √ 基本使用 通过list设置需要显示的菜单,该值为一个数组,元素为对象,对象至少要提供text属性,另外可选的有fontSize(字体大小),color(颜色),disabled(是否禁用,1.5.6引入), subText(描述信息,1.6.8引入

  • 我正在尝试单击一个菜单项,但是没有菜单项的webelements。 未单击菜单项时,web元素显示为: 单击菜单项后,Button标记就会改变。然而,菜单项的元素仍然是隐藏的。 菜单和单击后的图像在span标记中更改

  • 我正在尝试使用 optaplanner 5.5.0 为收银员制定时间表。计划实体与苗圃排班示例 (shiftAssignment) 相同,但计划变量(员工)可为空(可以存在未分配的班次)。所以 TS 工作得很好,但构造启发式(第一次适合)什么也没做(因为在我的情况下,我想所有零的解决方案是可行的)。我应该怎么做才能使施工启发式工作?

  • 如何从操作栏禁用“选项”菜单项? 我做了我自己的自定义栏,用于显示*. png标志,但我不想显示选项菜单的三个点按钮。 我试图找到一些解决办法,但没有任何效果。