comment changer le texte dans Android TextView

j'ai essayé de faire ce

@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 second texte apparaît quand je l'exécute. Je pense que ça a quelque chose à voir avec le blocage de la méthode Thread.sleep() . Quelqu'un peut-il me montrer comment implémenter une minuterie "asynchrone"?

Merci.

91
demandé sur lambda 2010-02-20 01:50:38

8 réponses

je viens de poster cette réponse dans l'android-discuter du groupe google

si vous essayez juste d'ajouter du texte à la vue de sorte qu'il affiche "étape un: blast egg étape deux: fry egg" puis envisager 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 sorte qu'il dit "étape un: blast egg" au démarrage et puis il dit "étape deux: fry egg" à un moment plus tard, vous pouvez toujours utiliser un

exemple Runnable que sadboy a donné

bonne chance

45
répondu snctln 2013-07-24 08:44:46

votre "méthode 151920920" a plusieurs énormes défauts:

1) onCreate prépare votre activité - donc rien que vous faites ici sera fait visible à l'utilisateur jusqu'à ce que cette méthode se termine! Par exemple - vous ne serez jamais en mesure de modifier le texte d'un TextView ici plus que un fois que seul le dernier changement sera dessiné et donc visible à l'utilisateur!

2) Gardez à l'esprit qu'un Android programme, par défaut, exécuter en UN fil! Ainsi: n'utilisez jamais Thread.sleep() ou Thread.wait() dans votre fil principal qui est responsable de votre UI! (lire , "Tenir la réactivité de votre Application" pour de plus amples informations!)

ce que fait votre initialisation de votre activité est:

  • pour aucune raison vous créez un nouveau TextView objet t !
  • vous choisissez votre layout TextView dans la variable t plus tard.
  • vous mettez le texte de t (mais gardez à l'esprit: il sera affiché seulement après onCreate() finis et la boucle principale d'événement de votre application court!)
  • vous attendez 10 Secondes dans votre onCreate méthode - ce ne doit jamais être fait comme il arrête toute activité D'UI et va certainement forcer un ANR (Application ne répond pas, voir le lien ci-dessus!)
  • ensuite, vous définissez un autre texte - celui-ci sera affiché dès que vos méthodes onCreate() et plusieurs autres cycle de vie de L'activité ont été traitées!

La solution:

  1. Ensemble du texte qu'une seule fois dans onCreate() - ce doit être le 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. installez cette exécutable comme un handler, possible dans onCreate() (mais lisez mon conseil ci-dessous):

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

conseil: assurez-vous de connaître le cycle de vie d'un Activity ! Si vous faites des choses comme ça dans onCreate() cela ne sera se produire lorsque votre Activity est créé le premier temps! Android pourra éventuellement garder votre Activity en vie pour une période plus longue, même si elle n'est pas visible! Quand un utilisateur "démarre" à nouveau - et il existe toujours - vous ne verrez plus votre premier texte!


=> toujours installer des gestionnaires dans onResume() et les désactiver dans onPause() ! Autrement, vous obtiendrez des mises à jour lorsque votre Activity n'est pas visible à tous! Dans votre cas, si vous voulez voir votre premier texte à nouveau lorsqu'il est réactivé , vous devez le définir dans onResume() , et non dans onCreate() !

145
répondu Zordid 2013-03-02 17:59:50

La première ligne de texte nouveau point de vue est inutile

t=new TextView(this); 

, tu peux faire ça

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

autant qu'un fil de fond qui dort ici est un exemple, mais je pense qu'il y a une minuterie qui serait mieux pour cela. voici un lien vers un bon exemple à l'aide d'une minuterie à 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");
            }
        };
14
répondu Patrick Kafka 2010-02-19 23:07:32

@user264892

j'ai trouvé que lorsque j'utilisais une variable String j'avais besoin soit de préfixer avec une chaîne de "" soit de lancer explicitement 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, depuis votre chaîne n'est pas dynamique, mieux encore:

txtStatus.setText("AskingServer...");
6
répondu jwalton85 2011-08-20 15:07:38

pour votre conseil, j'utilise handle et runnables pour changer le contenu de TextView en utilisant un "timer". pour une raison quelconque, lors de la course, l'application saute toujours la deuxième étape ("étape deux: Fry egg"), et ne montrer la dernière (troisième) étape ("étape trois: 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);      
    ...
}
3
répondu user270811 2014-05-20 23:16:18

:) votre utilisation du fil d'une mauvaise manière. Il suffit de faire ce qui suit:

private void runthread()
{

splashTread = new Thread() {
            @Override
            public void run() {
                try {
                    synchronized(this){

                        //wait 5 sec
                        wait(_splashTime);
                    }

                } catch(InterruptedException e) {}
                finally {
                    //call the handler to set the text
                }
            }
        };

        splashTread.start(); 
}

C'est ça.

0
répondu jitain sharma 2012-10-03 18:29:35

mettre le texte à sam textview deux fois écrira le premier texte écrit. Donc la deuxième fois que nous utilisons settext, nous ajoutons simplement la nouvelle chaîne comme

textview.append("Step Two: fry egg");
0
répondu Disha 2014-05-05 06:21:33

@Zordid @Iambda réponse est grande, mais je trouve que si je mets

mHandler.postDelayed(mUpdateUITimerTask, 10 * 1000);

dans la méthode run() et

mHandler.postDelayed(mUpdateUITimerTask, 0);

dans la méthode onCreate font la chose garder la mise à jour.

0
répondu Kevin Zhao 2015-04-13 22:09:51