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

文本观察器在文本更改之前、文本更改之前和之后的文本更改后之间的差异

邹祺
2023-03-14

在我的Android项目中,我必须将TextChangedListener(TextWatcher)添加到编辑文本视图中。它有三个部分:

    < Li > < code > ontext changed() < Li > < code > beforeTextChanged() < Li > < code > afterTextChanged()

这三个有什么区别?我必须在键侦听器上实现一个表搜索,对于我的情况,这三个表看起来都一样。它们的功能也一样。当我输入产品名称的一部分时,表只会用其中包含输入文本的产品进行重新绘制。但我使用了afterTextChanged()部分。我的代码是:

EditProduct.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before,
                int count) {
            // TODO Auto-generated method stub

            // System.out.println("onTextChanged"+s);
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub
            // System.out.println("beforeTextChanged"+s);
        }

        @Override
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub
            // System.out.println("afterTextChanged"+s);

            String new_prx = s.toString();

            System.out.println(s);
            mini_productList = new ArrayList<Product>();

            // mini_productList
            int count = 0;
            if (new_prx.equals("")) {

                loadtableProducts(productList);

            } else {

                for (int i = 0; i < productList.size(); i++) {

                    if (productList.get(i).getDescription().toString()
                            .substring(0, (new_prx.length()))
                            .equalsIgnoreCase(new_prx)) {
                        mini_productList.add(productList.get(i));
                        count++;

                    }
                }

                loadtableProducts(mini_productList);
            }
        }
    });

有人能解释一下这三个问题吗?

共有3个答案

益和雅
2023-03-14
匿名用户

Android < code > TextChangedListener 是一种在输入字段的文本改变时被调用的触发器。

TextChangedListener有三个事件。

1.beforeTextChanged:这意味着字符将被一些新的文本替换。该文本不可编辑。当您需要查看将要更改的旧文本时,会使用该事件。

2.on文本已更改:已进行更改,某些字符刚刚被替换。文本不可编辑。当您需要查看文本中的哪些字符是新字符时,将使用此事件。

3.afterTextChanged:同上,只是现在文本是可编辑的。当您需要查看并可能编辑新文本时,会使用此事件。

仲孙疏珂
2023-03-14

onTextChanged在文本更改期间运行。

postTextChanged在文本更改后立即运行。

之前文本更改在文本更改之前的瞬间运行。

根据您希望何时分配变量或执行操作,您可能希望在更改之前或之后立即运行代码。

下面是一个示例:

String afterTextChanged = "";
String beforeTextChanged = "";
String onTextChanged = "";

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

    et = (EditText)findViewById(R.id.editText);

    et.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int st, int b, int c) 
        {
            onTextChanged = et.getText().toString();
        }

        @Override
        public void beforeTextChanged(CharSequence s, int st, int c, int a) 
        {
            beforeTextChanged = et.getText().toString();
        }

        @Override
        public void afterTextChanged(Editable s) 
        {
            afterTextChanged = et.getText().toString();
            Toast.makeText(Activity.this, "before: " + beforeTextChanged
                                           + '\n' + "on: " + onTextChanged 
                                           + '\n' + "after: " + afterTextChanged
                           ,Toast.LENGTH_SHORT).show();
        }
    });
}

在这种情况下,假设您将文本从“h”更改为“hi”,输出将是:

前:“h”
上:“hi”
后:“hi”

商鸿哲
2023-03-14

“之前已更改”和“已更改文本”的参数起初有点难以理解。在示例中看到它们可能会有所帮助。请多次观看以下演示。注意计数。

  • 红色高亮是即将被绿色文本替换的旧文本。
  • 绿色高亮是刚刚替换红色文本的新文本。
  • start是红色突出显示文本(即将删除)的开始索引
  • count是红色突出显示的文本(即将删除)的长度
  • 后面是绿色突出显示文本的长度(即将添加)
    < li> start是绿色突出显示文本(刚刚添加的)的开始索引。< br >这与< code>beforeTextChanged的< code>start相同。 < li> before是红色高亮显示文本的长度(刚刚被删除)。< br >这与< code>beforeTextChanged的< code>count相同。 < li> 计数是绿色突出显示文本的长度(刚刚添加的)。< br >这与< code>beforeTextChanged的< code>after相同。
  • editable是EditText中的可编辑文本。你可以在这里更改它。这样做将再次触发所有TextWatcher事件
  • 您没有得到任何关于更改内容的信息。如果您想知道,可以在onTextChanged中设置span,然后在此处查找span

如果要观察所做的更改,请在“更改文本更改”()“文本更改”() 之前使用。但是,您不得在这两种方法中的任何一种中更改字符序列文本。

如果要在文本更改后进一步修改文本,请在afterTextChanged()中进行。

如果你想自己玩,这是代码。

主活动.java

public class MainActivity extends AppCompatActivity {

    final static int RED_COLOR = Color.parseColor("#fb7373");
    final static int GREEN_COLOR = Color.parseColor("#40de83");

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

        EditText editText = findViewById(R.id.editText);
        final TextView tvBeforeText = findViewById(R.id.tvBeforeText);
        final TextView tvBeforeNumbers = findViewById(R.id.tvBeforeNumbers);
        final TextView tvAfterText = findViewById(R.id.tvAfterText);
        final TextView tvAfterNumbers = findViewById(R.id.tvAfterNumbers);

        editText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                SpannableString spannableString = new SpannableString(s);
                BackgroundColorSpan backgroundSpan = new BackgroundColorSpan(RED_COLOR);
                spannableString.setSpan(backgroundSpan, start, start + count, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                tvBeforeText.setText(spannableString);
                tvBeforeNumbers.setText("start=" + start + "  count=" + count + " after=" + after);
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                SpannableString spannableString = new SpannableString(s);
                BackgroundColorSpan backgroundSpan = new BackgroundColorSpan(GREEN_COLOR);
                spannableString.setSpan(backgroundSpan, start, start + count, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                tvAfterText.setText(spannableString);
                tvAfterNumbers.setText("start=" + start + " before=" + before + " count=" + count);
            }

            @Override
            public void afterTextChanged(Editable s) {
                Log.i("TAG", "afterTextChanged: " + s);
            }
        });
    }
}

activity_main.xml(活动_主.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="5dp">

    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:text="beforeTextChanged" />

    <TextView
        android:id="@+id/tvBeforeText"
        android:textSize="17sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/tvBeforeNumbers"
        android:textSize="17sp"
        android:text="start=0 count=0 after=0"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:layout_marginTop="20dp"
        android:text="onTextChanged" />

    <TextView
        android:id="@+id/tvAfterText"
        android:textSize="17sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/tvAfterNumbers"
        android:textSize="17sp"
        android:text="start=0 count=0 after=0"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>

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

  • 我正试图在一个需要过滤非数字字符和点的编辑文本上实现一个过滤器。我可以使用编辑文本或输入类型的数字标签,但似乎设备之间有轻微的差异,就像有些设备即使在编辑文本中过滤它们也显示点字符。 下面是afterTextChanged方法 这是输出结果 如您所见,在我删除第一个“h”后,当我输入另一个h时,字符串变为“66hh”,其中它应该是“66h”,因为我已经删除了第一个h。什么原因会阻止我对可编辑的更改

  • 我在读关于Android编程中的TextWatcher的文章。我无法理解和之间的区别。 虽然我提到了TextWatcher的onTextChanged、beforeTextChanged和postTextChanged之间的差异,但我仍然无法想到需要使用而不是的情况。

  • 问题内容: 基本上,我有这个游戏,一旦猜出正确答案,它就会以一个新单词开始一个新游戏。我想显示,但是三秒钟后,将其更改为空字符串。我怎么做? 我的尝试: 编辑: 我的解决方案: 我不确定,但是我希望我遵循MadProgrammer的建议,而不是阻止事件本身,而是阻止新线程。我还将查找Java Timer。 问题答案: 摇摆是事件驱动的环境。当您阻止事件调度线程时,无法处理任何新事件。 您切勿在任何

  • 查看此截图: 我正在使用这段代码添加表情符号在div的跨度。 但标记后没有附加空格,这样我就可以在标记后编写下一个文本。

  • 问题内容: 我想更改与数组索引匹配的UITextView中特定文本的文本颜色。我能够略微修改此答案,但不幸的是,每个匹配短语的文本颜色仅更改了一次。 问题答案: 抱歉,我刚注意到您的消息。这是一个工作示例(在操场上测试):