132

我知道一点,TextWatcher但你输入的每个角色都会触发。我想要一个在用户完成编辑时触发的监听器。是否可以?同样在TextWatcher我得到一个实例,Editable但我需要一个EditText. 我怎么得到它?

编辑:第二个问题更重要。请回答。

4

10 回答 10

240

首先,如果失去焦点或用户是否按下完成按钮,您可以查看用户是否完成了文本编辑EditText(这取决于您的实现以及最适合您的方式)。其次,只有将 声明为实例对象时,才能EditText在其中获取实例。即使您不应该在其中编辑,因为它不安全。TextWatcherEditTextEditTextTextWatcher

编辑:

为了能够让EditText实例进入你的TextWatcher实现,你应该尝试这样的事情:

public class YourClass extends Activity {

    private EditText yourEditText;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);
        yourEditText = (EditText) findViewById(R.id.yourEditTextId);

        yourEditText.addTextChangedListener(new TextWatcher() {

            public void afterTextChanged(Editable s) {

                // you can call or do what you want with your EditText here

                // yourEditText... 
            }

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

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

请注意,上面的示例可能有一些错误,但我只是想向您展示一个示例。

于 2012-06-21T08:23:40.173 回答
32

为我的所有 EditText 字段实现一个侦听器需要我有丑陋、冗长的代码,这让我很困扰,所以我编写了下面的类。可能对任何偶然发现此问题的人有用。

public abstract class TextChangedListener<T> implements TextWatcher {
    private T target;

    public TextChangedListener(T target) {
        this.target = target;
    }

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

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

    @Override
    public void afterTextChanged(Editable s) {
        this.onTextChanged(target, s);
    }

    public abstract void onTextChanged(T target, Editable s);
}

现在实现一个监听器有点干净。

editText.addTextChangedListener(new TextChangedListener<EditText>(editText) {
            @Override
            public void onTextChanged(EditText target, Editable s) {
                //Do stuff
            }
        });

至于它触发的频率,人们可能会实施检查以在//Do stuff给定的 a 之后运行他们想要的代码

于 2016-09-21T19:05:54.600 回答
12

任何使用ButterKnife的人。你可以像这样使用:

@OnTextChanged(R.id.zip_code)
void onZipCodeTextChanged(CharSequence zipCode, int start, int count, int after) {

}
于 2016-06-17T17:05:01.453 回答
6

我已经使用AutotextView

AutotextView textView = (AutotextView) findViewById(R.id.autotextview);
textView.addTextChangedListener(new TextWatcher() {

    @Override
    public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
        seq = cs;
    }

    @Override
    public void beforeTextChanged(CharSequence s, int arg1, int arg2, int arg3) {

    }

    @Override
    public void afterTextChanged(Editable arg0) {
        new SearchTask().execute(seq.toString().trim());
    }

});
于 2014-05-12T07:26:30.583 回答
3
 myTextBox.addTextChangedListener(new TextWatcher() {  

    public void afterTextChanged(Editable s) {}  

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

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

    TextView myOutputBox = (TextView) findViewById(R.id.myOutputBox);  
    myOutputBox.setText(s);  

    }  
});  
于 2016-11-04T10:05:09.657 回答
2

TextWatcher对我没有用,因为它一直在为EditText每个人开火并弄乱彼此的价值观。

这是我的解决方案:

public class ConsultantTSView extends Activity {
    .....

    //Submit is called when I push submit button.
    //I wanted to retrieve all EditText(tsHours) values in my HoursList

    public void submit(View view){

        ListView TSDateListView = (ListView) findViewById(R.id.hoursList);
        String value = ((EditText) TSDateListView.getChildAt(0).findViewById(R.id.tsHours)).getText().toString();
    }
}

因此,通过使用该getChildAt(xx)方法,您可以检索 中的任何项目ListView并使用findViewById. 然后它将给出最新的值。

于 2013-07-11T00:45:49.630 回答
1

据我所知,只有两种方法可以做到。你怎么知道用户写完一个单词?要么失去焦点,要么点击“确定”按钮。在我看来,您无法知道用户按下了最后一个字符...

所以调用onFocusChange(View v, boolean hasFocus)或添加一个按钮和一个点击监听器。

于 2012-06-21T08:21:48.487 回答
1

Watcher 方法在每个字符输入时触发。所以,我基于 onFocusChange 方法构建了这段代码:

public static boolean comS(String s1,String s2){
    if (s1.length()==s2.length()){
        int l=s1.length();
        for (int i=0;i<l;i++){
            if (s1.charAt(i)!=s2.charAt(i))return false;
        }
        return true;
    }
    return false;
}

public void onChange(final EditText EdTe, final Runnable FRun){
    class finalS{String s="";}
    final finalS dat=new finalS();  
    EdTe.setOnFocusChangeListener(new OnFocusChangeListener() {          
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (hasFocus) {dat.s=""+EdTe.getText();}
            else if (!comS(dat.s,""+EdTe.getText())){(new Handler()).post(FRun);}       
        }
    });
}

要使用它,只需像这样调用:

onChange(YourEditText, new Runnable(){public void run(){
    // V  V    YOUR WORK HERE

    }}
);

您可以通过将 !comS(dat.s,""+EdTe.getText()) 替换为 !equal 函数来忽略 comS 函数。然而,equal 函数本身有时在运行时无法正常工作。

onChange 监听器会在用户输入焦点时记住 EditText 的旧数据,然后在用户失去焦点或跳转到其他输入时比较新数据。如果比较旧字符串与新字符串不同,它会触发工作。

如果您只有 1 个 EditText,那么您需要通过在窗口外制作 Ultimate Secret Transparent Micro EditText 并请求对其进行焦点来制作 ClearFocus 功能,然后通过导入方法管理器隐藏键盘。

于 2020-01-27T12:28:01.140 回答
1

在 Kotlin Android EditText 侦听器中设置使用,

   val searchTo : EditText = findViewById(R.id.searchTo)
   searchTo.addTextChangedListener(object : TextWatcher {
    override fun afterTextChanged(s: Editable) {

        // you can call or do what you want with your EditText here

        // yourEditText...
    }

    override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
    override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}
})
于 2020-10-09T08:45:48.760 回答
0

我已经从@RNGuy那里得到了解决方案,谢谢!并且稍微改变了监听器,所以现在它只会通过更新 textView 来接受整数。

import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;

public abstract class NumberChangedListener implements TextWatcher {
    private final EditText target;
    private final String defaultValue;

    public NumberChangedListener(EditText target, int defaultValue) {
        this.target = target;
        this.defaultValue = defaultValue + "";
    }

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

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

    @Override
    public void afterTextChanged(Editable s) {
        this.onTextChanged(target, s);
    }

    private void onTextChanged(EditText target, Editable s) {
        String input = s.toString();
        String number = input.replaceAll("[^\\d]", "");

        if (!number.equals(input)) {
            target.setText(number);
            return;
        }

        Integer integer;

        try {
            integer = Integer.valueOf(number);
        } catch (NumberFormatException ignored) {
            target.setText(defaultValue);
            return;
        }

        if (!integer.toString().equals(number)) {
            target.setText(integer.toString());
            return;
        }

        onNumberChanged(integer);

    }

    public abstract void onNumberChanged(int value);
}

并用作

    int defaultVal = 10;
    mTextView.addTextChangedListener(new NumberChangedListener(mTextView, defaultVal) {
        @Override
        public void onNumberChanged(int value) {
            // use the parsed int
        }
    });
于 2022-01-16T11:52:53.253 回答