这与以前的帖子有关: 我的布局是这样的:
INPUT TEXT(EditText)
按钮
输出文本(TextView)
任务: 当用户输入输入并按下按钮时,将显示输出文本。 我必须确保在按钮单击后10秒(以及输出文本出现后)输入和输出消失。
现在,我无法在TextView上添加“TextWatcher”。 最初我尝试在inputText上使用Handler,它可以有TextWatcher。但不知怎的,Handler一直在后台运行,我无法“取消”它。
所以我转而使用计时器。我在按钮onCick()方法中使用了一个方法:
onClick(){
...
eraseText();
....
}
public void eraseText(){
TimerTask task = new TimerTask() {
public void run() {
inputText.setText("");
outputText.setText("");
}
};
Timer timer = new Timer();
timer.schedule(task, 1000,10000);
}
10秒后我想调用timer.cancel()(但不知道在哪里!!) 正如您所看到的,问题是我收到一个错误,抱怨只有UI线程可以更改视图。怎么办呢?
由于
答案 0 :(得分:1)
使用 CountDownTimer
可以使用CountDownTimer
完成主UI更改 CountDownTimer cdt;
cdt = new CountDownTimer(1000,10000) {
@Override
public void onTick(long millisUntilFinished) {}
@Override
public void onFinish() {
// you can make UI changes here after 10 seconds
inputText.setText("");
outputText.setText("");
}
};
使用这些方法启动和取消
cdt.start();
cdt.cancel();
答案 1 :(得分:1)
我会使用Handler类。您可以轻松发布延迟代码并取消它。它将以正确的线程运行。此外,您可以添加TextWatcher或OnFocusChangeListener来检测和取消用户再次开始编辑文本时的文本擦除。
Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handler = new Handler();
final TextView textView = (TextView) findViewById(R.id.textView2);
final EditText editText = (EditText) findViewById(R.id.editText1);
final Runnable eraseText = new Runnable() {
@Override
public void run() {
textView.setText("");
editText.setText("");
}
};
editText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
handler.removeCallbacks(eraseText);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
});
editText.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View arg0, boolean arg1) {
handler.removeCallbacks(eraseText);
}
});
findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
textView.setText(editText.getText().toString());
handler.removeCallbacks(eraseText);
handler.postDelayed(eraseText, 1000);
}
});
}
答案 2 :(得分:0)
更喜欢Handler.postDelayed(Runnable run, long delay
)方法,它将在UI Thread
答案 3 :(得分:0)
首先,保留对Timer
对象的引用(作为班级中的某个字段),以便稍后取消。
其次,使用视图的post
方法在UI线程上执行代码。