91 votes

comment changer le texte dans un TextView Android

J'ai essayé de faire ça

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    t=new TextView(this); 

    t=(TextView)findViewById(R.id.TextView01); 
    t.setText("Step One: blast egg");

    try {
        Thread.sleep(10000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    t.setText("Step Two: fry egg");

mais pour une raison quelconque, seul le deuxième texte s'affiche lorsque je l'exécute. Je pense que cela peut avoir quelque chose à voir avec l'option Thread.sleep() blocage de la méthode. Quelqu'un peut-il donc me montrer comment mettre en œuvre une minuterie de manière "asynchrone" ?

Merci.

147voto

Zordid Points 3603

Votre onCreate() a plusieurs énormes défauts :

1) onCreate prépare votre activité - donc rien de ce que vous faites ici ne sera fait visible à l'utilisateur jusqu'à la fin de cette méthode ! Par exemple, vous ne serez jamais en mesure de modifier un fichier TextView Le texte de l'auteur est plus que ONE car seule la dernière modification sera dessinée et donc visible pour l'utilisateur !

2) Gardez à l'esprit qu'un programme Android s'exécute - par défaut - dans le format ONE uniquement le fil ! Ainsi : n'utilisez jamais Thread.sleep() ou Thread.wait() dans votre thread principal qui est responsable de votre interface utilisateur ! (lire "Gardez votre application réactive" pour plus d'informations)

Ce que votre initialisation de votre activité est :

  • sans raison, vous créez un nouveau TextView objet t !
  • vous choisissez votre mise en page TextView dans la variable t plus tard.
  • vous définissez le texte de t (mais gardez à l'esprit qu'il sera affiché seulement après onCreate() se termine et la boucle d'événement principale de votre application s'exécute !)
  • vous attendez 10 secondes au sein de votre onCreate méthode - cette ne doit jamais être fait car il arrête toute activité de l'interface utilisateur et va certainement forcer un ANR (Application Not Responding, voir le lien ci-dessus !)
  • puis vous définissez un autre texte - celui-ci s'affichera dès que votre onCreate() les finitions de la méthode et plusieurs autres Cycle de vie des activités ont été traitées !

La solution :

  1. Définissez le texte une seule fois dans onCreate() - il doit s'agir du premier texte qui doit être visible.

  2. Créer un Runnable et un Handler

    private final Runnable mUpdateUITimerTask = new Runnable() {
        public void run() {
            // do whatever you want to change here, like:
            t.setText("Second text to display!");
        }
    };
    private final Handler mHandler = new Handler();
  3. installer ce runnable en tant que handler, possible en onCreate() (mais lisez mes conseils ci-dessous) :

    // run the mUpdateUITimerTask's run() method in 10 seconds from now
    mHandler.postDelayed(mUpdateUITimerTask, 10 * 1000);

Conseil : assurez-vous de connaître un Activity Le cycle de vie de l'entreprise ! Si vous faites ce genre de choses dans onCreate() cela ne se produira que lorsque votre Activity est créé le premièrement temps ! Android va peut-être garder votre Activity pour une période plus longue, même s'il n'est pas visible ! Lorsqu'un utilisateur le "redémarre" - et qu'il est toujours existant - vous ne verrez plus votre premier texte !


\=> Toujours installer les gestionnaires dans onResume() et les désactiver dans onPause() ! Sinon, vous recevrez des "mises à jour" lorsque votre Activity n'est pas du tout visible ! Dans votre cas, si vous voulez voir à nouveau votre premier texte lorsqu'il est réactivé, vous devez le paramétrer dans onResume() pas onCreate() !

45voto

snctln Points 8687

Je viens de poster cette réponse dans le groupe google Android-discuss

Si vous essayez simplement d'ajouter du texte à la vue pour qu'elle affiche "Step One : blast egg Step Two : fry egg", envisagez alors d'utiliser t.appendText("Step Two: fry egg"); au lieu de t.setText("Step Two: fry egg");

Si vous voulez changer complètement ce qui est dans le TextView de façon à ce qu'il dise "Step One : blast egg" au démarrage et qu'il dise "Step Two : fry egg" à un moment ultérieur, vous pouvez toujours utiliser un

Exemple exécutable donné par sadboy

Bonne chance

14voto

Patrick Kafka Points 4857

La première ligne de la nouvelle vue de texte est inutile

t=new TextView(this); 

vous pouvez juste faire ça

TextView t = (TextView)findViewById(R.id.TextView01);

pour ce qui est d'un fil de fond qui dort, voici un exemple, mais je pense qu'un minuteur serait mieux adapté. voici un lien vers un bon exemple utilisant un minuteur à la place. http://Android-developers.blogspot.com/2007/11/stitch-in-time.html

    Thread thr = new Thread(mTask);
    thr.start();
}

Runnable mTask = new Runnable() {
    public void run() {
        // just sleep for 30 seconds.
                    try {
                        Thread.sleep(3000);
                        runOnUiThread(done);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
        }
    };

    Runnable done = new Runnable() {
        public void run() {
                   // t.setText("done");
            }
        };

6voto

jwalton85 Points 41

@user264892

J'ai constaté que lorsque j'utilisais une variable String, je devais soit la préfixer avec un String de "", soit la convertir explicitement en CharSequence.

Donc, au lieu de :

String Status = "Asking Server...";
txtStatus.setText(Status);

essayez :

String Status = "Asking Server...";
txtStatus.setText((CharSequence) Status);

ou :

String Status = "Asking Server...";    
txtStatus.setText("" + Status);

ou, puisque votre chaîne n'est pas dynamique, encore mieux :

txtStatus.setText("AskingServer...");

3voto

user270811 Points 518

Selon vos conseils, j'utilise des handle et des runnables pour changer le contenu du TextView en utilisant un "timer". Pour une raison quelconque, lors de l'exécution, l'application saute toujours la deuxième étape ("Step Two : fry egg"), et ne montre que la dernière (troisième) étape ("Step three : serve egg").

TextView t; 
private String sText;

private Handler mHandler = new Handler();

private Runnable mWaitRunnable = new Runnable() {
    public void run() {
        t.setText(sText);
    }
};

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    mMonster = BitmapFactory.decodeResource(getResources(),
            R.drawable.monster1);

    t=new TextView(this); 
    t=(TextView)findViewById(R.id.TextView01); 

    sText = "Step One: unpack egg";
    t.setText(sText);

    sText = "Step Two: fry egg";        
    mHandler.postDelayed(mWaitRunnable, 3000);

    sText = "Step three: serve egg";
    mHandler.postDelayed(mWaitRunnable, 4000);      
    ...
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X