0
votes

Quand je change de texte et montrez-le sur l'interface utilisateur dans le fil, rien n'est fait (Java)

Ce code est dans Oncreate dans la MainActivité

    inflater = getLayoutInflater();
    serversView = inflater.inflate(R.layout.layout_home, null, false);
    test = serversView.findViewById(R.id.titleDescription);

    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            try  {


                    //some code
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {

                            test.setText(utf8text+"mk");

                            Log.i(LOG_TAG,"serversView: "+ serversView + " test: "+ test + " test.getText().toString():"+ test.getText().toString());
                        }
                    });


            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });

    thread.start();


0 commentaires

3 Réponses :


0
votes

Ajoutez la ligne ci-dessous à l'intérieur de la méthode d'exécution forte>

SERVERSVIEW.INVALIDATEVIEWS (); P>

FOREXAMPLE, INTER> P>

public void run() {
    test.setText(utf8text+"mk");
    serversView.invalidateViews();
    Log.i(LOG_TAG,"serversView: "+ serversView + " test: "+ test + "test.getText().toString():"+ test.getText().toString());
}


1 commentaires

S'il vous plaît essayez d'utiliser Serversview.invalidate ()



0
votes

L'interface utilisateur ne peut pas être mis à jour par fil non UI, mais Android fournit la classe Android.os.Handler ou les classes d'asynctaques, ci-dessous est le code d'échantillon pour le gestionnaire de thread l'essayer.

public class MainActivity extends AppCompatActivity {
private ProgressBar progress;
private TextView text;
Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    progress = findViewById(R.id.progressBar1);
    text = findViewById(R.id.textView1);
    handler = new Handler();
}
public void startProgress(View view) {
    // do something long
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            for (int i = 0; i <= 10; i++) {
                final int value = i;
                doFakeWork();
                handler.post(new Runnable(){
                    @Override
                    public void run() {
                        progress.setProgress(value);
                        if(value!=10)
                            text.setText("updated");
                        else
                            text.setText("updating");
                    }
                });
            }
        }
    };
    new Thread(runnable).start(); }
    // Simulating something timeconsuming
private void doFakeWork() {
    try { SystemClock.sleep(5000);} catch (Exception e) {e.printStackTrace();}}}


7 commentaires

Ça n'aide pas. Peut-on avoir besoin de méthode de startProgress mis à Oncreate?


Aucune méthode de démarrage ci-dessus répond à Bouton Cliquez sur l'événement. J'ai ajouté cette méthode dans l'attribut OnClick du bouton dans la mise en page XML, avez-vous eu une erreur?


J'ai inséré cela dans Oncreate, mais toujours, TextView ne modifie pas le texte dans l'interface utilisateur, mais lors de la journalisation - changements


Oh, j'ai réalisé que vous devez l'insérer lorsque vous cliquez sur le bouton, j'ai tout fait tout, mais dans l'interface utilisateur ne change rien comme avant, et lorsque la journalisation change


Utiliser le gestionnaire de threads UI sera mis à jour à coup sûr. Je mette à jour votre code dans une autre réponse.


Ouais, quand tu m'as donné ton code. Maintenant, j'ai fabriqué Ctrl + Z avant mon code et il s'est avéré que mon code fonctionne, seul le problème n'est que sur la principaactivité, mais comment le faire de manière à pouvoir être modifié en ne pas transférer le code dans les classes de fragments?


Désolé, je n'ai pas eu de vouloir que vous essayiez de poser des questions sur la classe de fragments dans le code de thread ??



0
votes

classe de manutention du fil, essayez-le. XXX

}


1 commentaires

Vous pouvez communiquer les données de l'activité actuelle à une autre activité (à l'aide d'une intention explicite) ou de fragment (en définissant des arguments sur ce fragment), puis utilisez ces données dans l'interface utilisateur.