怎么改变文本,数秒后又恢复原来的文本?

一个textView,显示的文本内容是a;在一个事件后,文本内容变为b,且保持数秒后,恢复为a。怎么实现这个效果?

我已经尝试过的方法:1.在一个自定义的handler类a的run方法中,将文本a改为文本b;为了文本b保持数秒的效果,我又自定义了一个handler类b,在handler类b的run方法中使用thread.sleep(数秒)方法。在把文本a改为文本b后,用handler类b的对象发送消息,将文本b保持数秒,然后恢复为文本a。

。。。。。

兄弟,得学会自己想办法呀。

算了,给你一个完整的Demo吧。

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.Button;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import java.lang.ref.SoftReference;
import java.text.SimpleDateFormat;
import java.util.Locale;
import java.util.Timer;
import java.util.TimerTask;

public class HomeActivity extends AppCompatActivity {

    private TextView textView; // TextView对象

    private boolean isNeedKeep = false; // 开关(表示是否开启保持)

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        textView = new TextView(this); // TextView对象

        this.elapsedTime(); // 启动计时器,并追随当前页面的生命周期

        new Button(this).setOnClickListener(v -> { // 模拟一个事件
            textView.setText("b"); // 触发事件后TextView的内容变为:b
            isNeedKeep = true;
        });
    }

    private final Timer timer = new Timer();
    private final TimerHandler handler = new TimerHandler(this);

    private void elapsedTime() {
        timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                handler.sendEmptyMessage(0);
            }
        }, 0, 1000);
    }

    private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());

    private String formaterTime(long timemillis) {
        if (timemillis <= 0) return dateFormat.format(System.currentTimeMillis());
        return dateFormat.format(timemillis);
    }

    private int keepSecond = 5; // b需要保持的时间(秒)

    private void setCurrentTime(long timemillis) {
        if (isNeedKeep && keepSecond > 0) {
            keepSecond--;
            return;
        }
        isNeedKeep = false; // 开关(关闭保持状态)
        keepSecond = 5; // 恢复需要保持的时间
        textView.setText(this.formaterTime(timemillis)); // 初始内容为:当前时间
    }

    private static class TimerHandler extends Handler {
        private final SoftReference<HomeActivity> reference;

        TimerHandler(HomeActivity activity) {
            reference = new SoftReference<>(activity);
        }

        private long timemillis = System.currentTimeMillis();

        @Override
        public void handleMessage(@NonNull Message msg) {
            HomeActivity activity = reference.get();
            if (null == activity) return;
            timemillis += 1000; // 每次时间都+1s
            activity.setCurrentTime(timemillis);
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        timer.cancel(); // 页面不处于栈顶时,计时器停止
    }
}

 

     textview.setText(b);
      new Timer().schedule(new TimerTask() {
          @Override
          public void run() {
              runOnUiThread(new Runnable() {
                  @Override
                  public void run() {
                      //需注意,可能运行时,activity已经被回收,导致空指针
                      if (textView!=null){
                          textView.setText(a);
                      }
                  }
              });

          }
      },1000);//这里填入延迟多少毫秒秒后运行
 
TextView textView = new TextView(this); // TextView对象
textView.setText("a"); // 初始内容为:a

final Handler handler = new Handler(Looper.getMainLooper()); // 用于更新TextView内容Handler

new Button(this).setOnClickListener(v -> { // 模拟一个事件
     textView.setText("b"); // 触发事件后TextView的内容变为:b
     handler.postDelayed(() -> { // 通过Handler直接在主线程中启动一个定时任务
          textView.setText("a"); // 将TextView的内容恢复为:a
     }, 2000); // 2s后
});

 

忘了说了,文本a是用timer+handler实现的实时时间……

谢谢!其实我已经找到一个办法了,只是想知道还有没有其它方法。