java - TextView non si sta aggiornando




android google-maps (2)

Questo deriva dal fatto che Android è un sistema operativo che utilizza i messaggi. Quindi c'è una parte del sistema operativo che legge i messaggi ed esegue azioni in base all'ordine nel messaggio.

L'aggiornamento del testo nella TextView avviene in questo modo: quando esegui setText () il tuo codice prepara un messaggio e lo invia al sistema operativo per dirgli "Si prega di aggiornare la vista testo" ".

Possiamo semplificare la spiegazione dicendo che puoi inviare 10 lettere ad un amico, ma anche se invii le 10 lettere contemporaneamente, forse non saranno arrivate nello stesso momento ...

E qui, questo è il caso: per Android, i messaggi per l'interfaccia utente non sono messaggi "prioritari". Ma il codice app ha una priorità elevata. Quindi, quando esegui il setText (), il messaggio viene inviato, ma il sistema operativo non lo legge poiché, dopo setText (), esegui un'azione di codice enorme. Quindi il sistema operativo esegue il tuo codice e solo quando questo enorme pezzo di codice è finito, il sistema operativo dice "Oh, beh, forse ho ricevuto una lettera", apre la lettera find "Please refresh the textView" e fallo. Quindi ... DOPO tu enorme pezzo di codice.

Come risolverlo? Devi mettere il tuo enorme pezzo di codice in un gestore.

  TextView tmp_id_top_msg = (TextView) findViewById(R.id.text_top_clavier);
  tmp_id_top_msg.setText("message to display");

  Handler handler_spend_time;
  handler_spend_time = new Handler();
  handler_spend_time.postDelayed(Call_Huge_Code(), 100);

Poi:

public Runnable Call_Huge_Code()
{
    return new Runnable()
    {
        public void run()
        {
            // here your code...
        }
    };
}

Questo ritarderà l'esecuzione del tuo codice di 100 millisecondi che non è sufficiente per "rallentare" il processo ma che è sufficiente per Android per leggere il messaggio "refresh setText".

Ho un problema stupido l'aggiornamento del testo in un TextView utilizzando una classe gestore. Sto impostando la finestra Informazioni personalizzate su Google Maps.

mMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() {
            @Override
            public View getInfoWindow(Marker marker) {
                return null;
            }

            @Override
            public View getInfoContents(final Marker marker) {
                //setting marker as final***
                View v = getLayoutInflater().inflate(R.layout.my_layout, null);
                TextView name = (TextView) v.findViewById(R.id.name);


                final TextView status = (TextView) v.findViewById(R.id.status);

                for(MyItem mi : myItems){
                    if(mi.getName().equals(marker.getTitle())){

                        name.setText(mi.getName()); //This one updates normaly

                        Handler handler = new Handler();
                        handler.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                //this one sets the text, but doesnt update on UI
                                status.setText("Text"); 

                                //Here I call my update text function
                                updateTv(status, "Text");
                                //Refreshing the window***
                                marker.showInfoWindow();

                            }
                        }, 5000);
                        break;
                    }
                }

                return v;
            }
        });
    }

TextView "nome" si sta aggiornando normalmente, mentre "status" TextView sta solo aggiornando il suo contenuto e non aggiornandosi visivamente sullo schermo. Ho provato a invalidare, runOnUiThread() , ma niente sembra funzionare. So che la soluzione potrebbe essere molto ovvia, ma non la vedo.

Grazie in anticipo per il tuo aiuto!

MODIFICARE

Ecco come ho provato runOnUiThread ().

public void updateTv(final TextView tv, final String s){

        runOnUiThread(new Runnable() {
            @Override
            public void run() {

                tv.setText(s);

                tv.invalidate();

            }
        });
    }

Il mio XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Large Text"
        android:id="@+id/name"
        android:layout_gravity="center"
        android:gravity="center_horizontal"
        android:padding="10dp"/>


    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:text="..."
        android:id="@+id/status"
        android:gravity="center_horizontal"/>

</LinearLayout>

SOLUZIONE

Ho aggiornato la mia finestra chiamando i comandi commentati e firmati con *** nel codice sopra. Il mio ringraziamento va a "clownba0t"


Quindi stai provando ad aggiornare la vista dopo che è ritornata da getInfoContents() e che non funzionerà in quanto non è una vista live, vedi questo .

Qualcosa che potrebbe funzionare sta chiamando:

status.invalidate();




textview