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