我有一个应用程序,在程序开头显示免责声明。我希望按钮在一段时间内保持不可见,然后变得可见。 我设置了一个睡眠5秒的线程,然后尝试使按钮可见。但是,当我执行代码时出现此错误:
08-02 21:34:07.868:ERROR / AndroidRuntime(1401):android.view.ViewRoot $ CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能触及其视图。
如何计算5秒,然后使按钮可见? 感谢。
Thread splashTread = new Thread() {
@Override
public void run() {
try {
int waited = 0;
while(_active && (!_ok2)) {
sleep(100);
if(_active) {
waited += 100;
if(waited >= _splashTime)
{
turnButtonOn();
}
}
}
} catch(InterruptedException e) {
// do nothing
} finally {
finish();
startActivity(new Intent("com.lba.mixer.Choose"));
}
};
splashTread.start();
public static void turnButtonOn() {
okButton.setVisibility(View.VISIBLE);
}
答案 0 :(得分:55)
问题是,当您调用okButton.setVisibility(View.VISIBLE);
时,您不在UI线程中,因为您创建并运行自己的线程。你需要做的是获取你的按钮的处理程序,并通过你通过处理程序获得的UI线程设置可见性。
所以而不是
okButton.setVisibility(View.VISIBLE)
你应该做
okButton.getHandler().post(new Runnable() {
public void run() {
okButton.setVisibility(View.VISIBLE);
}
});
答案 1 :(得分:25)
我发现这是一个更简单的解决方案。延迟7秒的可见性
continuebutton.setVisibility(View.INVISIBLE);
continuebutton.postDelayed(new Runnable() {
public void run() {
continuebutton.setVisibility(View.VISIBLE);
}
}, 7000);
答案 2 :(得分:2)
我发现这是解决问题的更好方法 (button id = but_resend)
定义处理程序
private Handler handler;
扩展类
中的调用函数 showButtons();
在课后定义
private void showButtons() {
handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
((Button) findViewById(R.id.but_resend)).setVisibility(View.VISIBLE);
}
}, 20000); // produce 20 sec delay in button visibility
}
并记住通过
隐藏.xml文件中的可见性android:visibility="invisible"