在Android中删除EditText和EditView

时间:2013-07-09 09:02:42

标签: android android-layout textview

这与以前的帖子有关: 我的布局是这样的:

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线程可以更改视图。怎么办呢?

由于

4 个答案:

答案 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线程上执行代码。