一个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实现的实时时间……
谢谢!其实我已经找到一个办法了,只是想知道还有没有其它方法。