我需要将TextView设为蓝色半秒钟,然后再次变为白色(用户点击,它会闪烁蓝色)。
为此,我尝试将颜色设置为蓝色,设置500ms计时器,然后将其更改回白色。像这样:
// defining the TextView
final TextView showDatabase = new TextView(this);
showDatabase.setText("Show Database");
showDatabase.setTextColor(Color.WHITE);
// click listener
showDatabase.setOnClickListener (new View.OnClickListener() {
public void onClick(View v) {
showDatabase.setTextColor(Color.BLUE); // make it blue
// wait 500ms, then make it white again
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
showDatabase.setTextColor(Color.WHITE);
}
}, 500);
}
});
logcat的:
Only the original thread that created a view hierarchy can touch its views.
我不能简单地在计时器功能中创建一个TextView实例(我认为),因为它不是布局中的元素。
如何让自己从计时器功能中操作TextView?
答案 0 :(得分:2)
计时器在不同的线程上运行。你无法从那里更新ui。使用Handler
或runOnUiThread
。
runOnUiThread(new Runnable() {
@Override
public void run() {
showDatabase.setTextColor(Color.WHITE);
}
});
使用Handler
Handler m_handler;
Runnable m_handlerTask ;
m_handler = new Handler();
m_handlerTask = new Runnable()
{
@Override
public void run() {
showDatabase.setTextColor(Color.WHITE);
m_handler.postDelayed(m_handlerTask, 500);
}
};
m_handlerTask.run();
取消
m_handler.removeCallbacks(m_handlerTask);
答案 1 :(得分:2)
在计时器中添加runOnUiThread
:
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
// do UI updates here
}
});
}
}, 500);