web-dev-qa-db-fra.com

android définir la visibilité d'un bouton sur la minuterie

J'ai une application qui affiche un avertissement au début du programme. Je veux qu'un bouton reste invisible pendant un certain temps, puis devienne visible. J'ai configuré un fil qui dort pendant 5 secondes, puis essaie de rendre le bouton visible. Cependant, j'obtiens cette erreur lorsque j'exécute mon code:

08-02 21: 34: 07.868: ERREUR/AndroidRuntime (1401): Android.view.ViewRoot $ CalledFromWrongThreadException: Seul le thread d'origine qui a créé une hiérarchie de vues peut toucher ses vues.

Comment puis-je compter 5 secondes, puis rendre le bouton visible? Merci.

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

Le problème est que vous n'êtes pas dans le thread d'interface utilisateur lorsque vous appelez okButton.setVisibility(View.VISIBLE);, car vous créez et exécutez votre propre thread. Ce que vous devez faire est d'obtenir le gestionnaire de votre bouton et de définir la visibilité via le thread d'interface utilisateur que vous obtenez via le gestionnaire.

Donc au lieu de

okButton.setVisibility(View.VISIBLE)

tu devrais faire

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

J'ai trouvé que c'était une solution beaucoup plus simple. Visibilité sur 7 secondes de retard

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

J'ai trouvé que c'était une meilleure solution au problème (bouton id = but_resend)

définir le gestionnaire

  private Handler handler;

fonction d'appel dans une classe étendue

 showButtons();

définir après la classe

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


    }

et n'oubliez pas de masquer la visibilité dans le fichier.xml en

Android:visibility="invisible"
3
Avinash jain