我试图在文本更改后的一段时间后调用一个函数。我设置了延迟,但由于某种原因我的函数被调用了两次。这是我的代码:
public class ExampleFragment extends Fragment {
private EditText mText;
private Handler mHandler;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
mHandler = new Handler();
View rootView = inflater.inflate(R.layout.fragment_start_process, container, false);
mText = (EditText) rootView.findViewById(R.id.editText1);
mText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(final Editable s) {
// HERE IS WHERE I WILL CALL MY FUNCTION (Prints show my issue)
System.out.println("TEXT CHANGE" + s);
final Runnable r = new Runnable() {
@Override
public void run() {
final Editable x = s;
System.out.println("DELAY TEXT " + xEditable);
}
};
mHandler.postDelayed(r, 1000);
}
});
return rootView;
}
我的 System.out.println 语句如下所示:
文字变化H
文本更改嗨
延迟文本嗨
延迟文本嗨
所以看起来当我将我的函数放入 runnable 时,它会运行两次。我只希望它运行一次(延迟文本应该只显示一次)。知道我做错了什么吗?我的整个目标是在文本更改后等待一段时间(以确保文本已完全上传),然后运行我的函数一次。我读过可以使用 AsyncTask,但我对此并不熟悉。任何帮助将不胜感激。
最佳答案
您的 Runnable 正在执行两次,因为在每个键入字符后都会调用 afterTextChanged()。
如果你想在用户开始输入 1 秒后执行一些代码,你可以向 runnable 添加一个标志,让它只运行一次。
private boolean mFlag = true;
@Override
public void afterTextChanged(final Editable s) {
// HERE IS WHERE I WILL CALL MY FUNCTION (Prints show my issue)
Log.w(TAG, "TEXT CHANGE " + s);
final Runnable mRunnable = new Runnable() {
@Override
public void run(){
final Editable x = s;
Log.w(TAG, "DELAY TEXT " + x.toString());
}
}
if(mFlag){
mHandler.postDelayed(r, 1000);
mFlag = false;
}
}
关于java - 文本在 fragment 内更改后,Android 调用一次函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24827812/