0

这链接到以前的帖子: 我的布局是这样的:

输入文本(编辑文本)

按钮

输出文本(文本视图)

任务:当用户输入输入并单击按钮时,会出现输出文本。我必须确保在单击按钮后大约 10 秒(以及在输出文本出现后)使输入和输出消失。

现在,我无法在 TextView 上添加“TextWatcher”。最初我尝试在 inputText 上使用 Handler,它可以有一个 TextWatcher。但不知何故,处理程序一直在后台运行,我无法“取消”它。

所以我转而使用计时器。我在按钮 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 线程可以更改视图。怎么能做到这一点?

谢谢

4

4 回答 4

1

使用倒计时

可以使用 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();
于 2013-07-09T09:12:52.453 回答
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);
        }
    });
}
于 2013-07-09T09:36:16.813 回答
0

更喜欢Handler.postDelayed(Runnable run, long delay) 方法,它将在 UI Thread 上运行

于 2013-07-09T09:06:12.677 回答
0

首先,保留对Timer对象的引用(作为类中的字段),以便以后可以取消它。

其次,使用post视图的方法在 UI 线程上执行代码。

于 2013-07-09T09:07:37.657 回答