web-dev-qa-db-ja.com

androidタイマーのボタンの可視性を設定する

プログラムの最初に免責事項を表示するアプリがあります。ボタンを一定時間非表示にしてから表示したい。 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);
      }
14
steve

問題は、独自のスレッドを作成して実行するため、okButton.setVisibility(View.VISIBLE);を呼び出すときにUIスレッドにいないことです。ボタンのハンドラーを取得し、ハンドラーを介して取得したUIスレッドを介して可視性を設定する必要があります。

だから代わりに

okButton.setVisibility(View.VISIBLE)

やったほうがいい

okButton.getHandler().post(new Runnable() {
    public void run() {
        okButton.setVisibility(View.VISIBLE);
    }
});
55
Andy Zhang

私はこれがはるかに簡単な解決策であることがわかりました。 7秒遅延の可視性

continuebutton.setVisibility(View.INVISIBLE);
continuebutton.postDelayed(new Runnable() {
        public void run() {
            continuebutton.setVisibility(View.VISIBLE);
        }
    }, 7000);
26
user1730217

私はこれが問題のより良い解決策であることを発見しました(ボタン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"
3
Avinash jain