2010-08-02 5 views
12

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. Je configure un thread qui dort pendant 5 secondes, puis essaie de rendre le bouton visible. Toutefois, j'obtiens cette erreur lorsque j'exécute mon code:android régler la visibilité d'un bouton sur le minuteur

08-02 21: 34: 07.868: ERROR/AndroidRuntime (1401): android.view.ViewRoot $ CalledFromWrongThreadException: Seul le thread d'origine qui a créé une hiérarchie de vue peut touchez ses points de vue.

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); 
     } 

Répondre

53

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

Ainsi, au lieu de

okButton.setVisibility(View.VISIBLE) 

vous devriez faire

okButton.getHandler().post(new Runnable() { 
    public void run() { 
     okButton.setVisibility(View.VISIBLE); 
    } 
}); 
+0

Pouvons-nous trouver quelque chose comme, particulier Voir la section de ListView est visible à partir de 3 (toute instance de temps) secondes. –

+0

merci l'homme que vous économisez mon temps .. :) –

22

Je trouve que cela est 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); 
+0

fonctionne comme par magie .... Thanx – Richa

+0

D'accord, c'est une solution magique. Merci d'avoir partagé. – Andy

+0

Wow, pas de problème avec celui-ci! – Sonhja