很抱歉这个尴尬的标题,我不知道如何更清楚地描述我的问题。
屏幕上有两个textviews
。一个textview
是分钟中剩余的秒数(因此它总是小于60,当它达到0时它将从59开始),而另一个textview
保持总量计时器中剩余的秒数(从一个可能大于60的数字开始,在停止前倒计时到0)。
我有一个按钮可以将引用交换到这些TextViews
,这样保留分钟中剩余秒数的文本将与保留总剩余秒数的文本交换,并且反之亦然。可以多次单击该按钮,以便可以根据用户的选择来回交换值。
奇怪的是,当我设置文本时,当我从一个方向交换到另一个方向时(从几分钟的秒数到剩余的总秒数),它会立即更新textviews
,但是另一个方向将被延迟并等待scheduleAtFixedRate
计时器完成另一次迭代(永远1000ms)。
显然,我想要的行为是立即交换文本,没有延迟。它只在一个方向上起作用,而在另一个方向上起作用。
以下是我正在使用的代码:
String totalSecs = secondsTotal.getText().toString();
String secsSecs = seconds.getText().toString();
//switch the TextView id's
//WORKS IMMEDIATELY
if (seconds.getId() == R.id.secondsTotal){
seconds = (TextView)findViewById(R.id.secondsLabel);
secondsTotal = (TextView)findViewById(R.id.secondsTotal);
seconds.setText(totalSecs);
secondsTotal.setText(secsSecs);
}
else{ //IS DELAYED UNTIL TIMER ITERATION
seconds = (TextView)findViewById(R.id.secondsTotal);
secondsTotal = (TextView)findViewById(R.id.secondsLabel);
seconds.setText(secsSecs);
secondsTotal.setText(totalSecs);
}
我的计时器如下:
Timer t = new Timer();
//set the schedule function
t.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
startCountdown(); //for seconds left in minute
startCountdownTotal(); //for total seconds remaining
}
});
}
}, 0, 1000);
答案 0 :(得分:0)
添加
seconds.invalidate();
secondsTotal.invalidate();
更改值后调用后的可能发生的事情是(以分钟为单位)的文本值比视图中的现有文本短,因此它会强制进行布局。