プログラムの最初に免責事項を表示するアプリがあります。ボタンを一定時間非表示にしてから表示したい。 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);
}
問題は、独自のスレッドを作成して実行するため、okButton.setVisibility(View.VISIBLE);
を呼び出すときにUIスレッドにいないことです。ボタンのハンドラーを取得し、ハンドラーを介して取得したUIスレッドを介して可視性を設定する必要があります。
だから代わりに
okButton.setVisibility(View.VISIBLE)
やったほうがいい
okButton.getHandler().post(new Runnable() {
public void run() {
okButton.setVisibility(View.VISIBLE);
}
});
私はこれがはるかに簡単な解決策であることがわかりました。 7秒遅延の可視性
continuebutton.setVisibility(View.INVISIBLE);
continuebutton.postDelayed(new Runnable() {
public void run() {
continuebutton.setVisibility(View.VISIBLE);
}
}, 7000);
私はこれが問題のより良い解決策であることを発見しました(ボタン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"