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

Android中的文本观察器

容俊豪
2023-03-14

我有一个程序,其中有一个editText。我想实现TextWatcher以反映总editText中的更改。当编辑框达到最大字符数限制10时,我想显示警告对话框。当我实现文本观察程序时,它可以工作,但当它达到10个字符时,它显示两个警告框。这是我的密码

private TextWatcher mTextEditorWatcher = new TextWatcher() {
    public void beforeTextChanged(CharSequence s, int start, int count,
            int after) {
    }

    public void onTextChanged(CharSequence s, int start, int before,
            int count) {
        // This sets a textview to the current length
        // mTextView.setText(String.valueOf(s.length()));

    }

    public void afterTextChanged(Editable s) {
        if (s.length() == 10) {
            messageBody.setImeOptions(EditorInfo.IME_ACTION_DONE);
            AlertDialog.Builder alert = new AlertDialog.Builder(
                    SendSms.this);

            alert.setMessage("You Cross the limit of 10 Words !");
            alert.setPositiveButton("OK",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog,
                                int whichButton) {

                        }
                    });

            alert.show();

        }

    }
};

共有3个答案

齐承泽
2023-03-14

试试这个..

你有没有试过在文本更改

private TextWatcher mTextEditorWatcher = new TextWatcher() {
    public void beforeTextChanged(CharSequence s, int start, int count,
            int after) {
    }

    public void onTextChanged(CharSequence s, int start, int before,
            int count) {
        // This sets a textview to the current length
        // mTextView.setText(String.valueOf(s.length()));


        if (s.length() == 10) {
            messageBody.setImeOptions(EditorInfo.IME_ACTION_DONE);
            AlertDialog.Builder alert = new AlertDialog.Builder(
                    SendSms.this);

            alert.setMessage("You Cross the limit of 10 Words !");
            alert.setPositiveButton("OK",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog,
                                int whichButton) {

                        }
                    });

            alert.show();

        }

    }

    public void afterTextChanged(Editable s) {

    }
};
马宜民
2023-03-14
 AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
             SendSms.this);
     AlertDialog alertDialog ;

 private TextWatcher mTextEditorWatcher = new TextWatcher() {
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
        }

        public void onTextChanged(CharSequence s, int start, int before,
                int count) {
            // This sets a textview to the current length
            // mTextView.setText(String.valueOf(s.length()));

      if (s.length() >= 10) {
                messageBody.setImeOptions(EditorInfo.IME_ACTION_DONE);
                        alertDialogBuilder.setMessage("You Cross the limit of 10 Words !");
         alertDialogBuilder.setPositiveButton("OK",
                 new DialogInterface.OnClickListener() {
                     public void onClick(DialogInterface dialog,
                             int whichButton) {

                     }
                 });

         alertDialog = alertDialogBuilder.create();
         if(alertDialog != null  && !alertDialog.isShowing()){
             alertDialog.show();
         }



            }
    else
    {
       mTextView.setText(String.valueOf(s.length()));
    }



        }

        public void afterTextChanged(Editable s) {


        }
    };

我已经编辑了代码。全局声明警报对话框,检查是否已经显示警报对话框,然后显示警报

郑伟彦
2023-03-14

这是此方法的常见行为。您需要使用标志进行处理。

使用此代码

   private TextWatcher mTextEditorWatcher = new TextWatcher() {
        boolean flag = false; 

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count,
            int after) {
    }

    @Override
    public void afterTextChanged(Editable s) {
        if (s.length() == 10) {
            if (!flag) {
                messageBody.setImeOptions(EditorInfo.IME_ACTION_DONE);
                AlertDialog.Builder alert = new AlertDialog.Builder(
                        SendSms.this);

                alert.setMessage("You Cross the limit of 10 Words !");
                alert.setPositiveButton("OK",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                    int whichButton) {

                            }
                        });

                alert.show();
            }
            flag = true; 
        } else {
            flag = false; 
        }

    }
});

其他参考文献

TextWatcher事件被多次触发

TextWatcher的事件被调用了两次

更好的方法是使用setError。阅读如何使用它。

 类似资料:
  • 我必须取编辑文本的值并将其除以1.21....错误在哪里 错误:

  • 问题内容: 我一直在阅读Observer模式,以保持UI处于最新状态,但仍然看不到它的用途。即使在我的特定对象中通知了我的MainActivity然后运行update();方法我仍然无法使用Pet对象来获取更新值,因为该对象是在Oncreate中创建的…而我只是无法创建新对象,因为那时变量会有所不同..这是我的实施,它似乎不起作用。 观察者/ MainActivity 可观察/宠物 问题答案: 首

  • 我目前正在努力使用这个温度转换器应用程序。这个应用程序的工作原理是,如果我在空白文本中输入一个数字,它将计算到其他温度单位,而无需点击按钮(由文本观察者) 在这里,我需要使用Double value从EditText中提取数字,并使用该值生成一个等式,然后将其插入结果视图。所以在本例中,我使用: 在EditText中插入的值是多少。 应用程序一直在运行,直到我在文本字段中输入任何数字,应用程序崩溃

  • 此外,为什么Viewmodel不能观察到它自己的LiveData的变化?

  • 是否有一种设计模式可以形成一个“复合”观察者/可观察者? 我的意思是我有一个可观察的,它在某个变化时通知它的监听器。 每个监听器也是一个可观察的,并通知它自己的监听器(在某个动作上,它做了哪个动作是由第一个可观察的通知触发的)。 这种观察者/可观察的“链接”作为设计是可以的,还是有一个标准的模式?

  • 问题内容: 给定汽车清单(),我可以这样做: 有没有办法我可以从一个到一个序列? 像没有参数的东西 问题答案: 您可以这样映射到: 请注意,flatMapping可能不会保留源可观察的顺序。如果订单对您很重要,请使用。