我知道一点,TextWatcher
但你输入的每个角色都会触发。我想要一个在用户完成编辑时触发的监听器。是否可以?同样在TextWatcher
我得到一个实例,Editable
但我需要一个EditText
. 我怎么得到它?
编辑:第二个问题更重要。请回答。
我知道一点,TextWatcher
但你输入的每个角色都会触发。我想要一个在用户完成编辑时触发的监听器。是否可以?同样在TextWatcher
我得到一个实例,Editable
但我需要一个EditText
. 我怎么得到它?
编辑:第二个问题更重要。请回答。
首先,如果失去焦点或用户是否按下完成按钮,您可以查看用户是否完成了文本编辑EditText
(这取决于您的实现以及最适合您的方式)。其次,只有将 声明为实例对象时,才能EditText
在其中获取实例。即使您不应该在其中编辑,因为它不安全。TextWatcher
EditText
EditText
TextWatcher
编辑:
为了能够让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) {}
});
}
}
请注意,上面的示例可能有一些错误,但我只是想向您展示一个示例。
为我的所有 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 之后运行他们想要的代码
任何使用ButterKnife的人。你可以像这样使用:
@OnTextChanged(R.id.zip_code)
void onZipCodeTextChanged(CharSequence zipCode, int start, int count, int after) {
}
我已经使用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());
}
});
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);
}
});
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
. 然后它将给出最新的值。
据我所知,只有两种方法可以做到。你怎么知道用户写完一个单词?要么失去焦点,要么点击“确定”按钮。在我看来,您无法知道用户按下了最后一个字符...
所以调用onFocusChange(View v, boolean hasFocus)
或添加一个按钮和一个点击监听器。
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 功能,然后通过导入方法管理器隐藏键盘。
在 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) {}
})
我已经从@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
}
});