2016-11-13 4 views
2

Ich habe ein dummes Problem, Text in einem TextView mit einer Handler-Klasse zu aktualisieren. Ich stelle das benutzerdefinierte Info-Fenster in Google Maps ein.TextView nicht aktualisieren

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 „name“ ist die Aktualisierung normalerweise, während „Status“ TextView nur seinen Inhalt zu aktualisieren und nicht visuell auf dem Bildschirm zu aktualisieren. Ich habe versucht, ungültig zu machen, runOnUiThread(), aber nichts scheint zu funktionieren. Ich weiß, dass die Lösung wirklich offensichtlich ist, aber ich sehe es nicht.

Vielen Dank für Ihre Hilfe im Voraus!

EDIT

Hier ist, wie ich runOnUiThread (versucht).

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

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

       tv.setText(s); 

       tv.invalidate(); 

      } 
     }); 
    } 

Meine 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> 

SOLUTION

aktualisiert ich mein Fenster durch Befehle kommentiert und unterzeichnet mit *** in dem obigen Code aufrufen. Mein Dank geht an "clownba0t"

+0

Sie sollten UI-Element auf dem Haupt-Thread aktualisieren. Zeigen Sie den Code, den Sie verwendet haben, als Sie sagten, dass Sie runOnUiThread() ausprobiert haben. – HelloSadness

+0

Würde es Ihnen etwas ausmachen, 'R.layout.my_layout' zu posten? – clownba0t

+0

Ihr Layout xml? da name textView arbeitet, hat das wahrscheinlich nichts mit dem update-mechanismus zu tun, etwas stimmt nicht mit dem mapping! –

Antwort

0

So versuchen Sie, die Ansicht zu aktualisieren, nachdem es von getInfoContents() zurückgekehrt ist, und das wird nicht funktionieren, da es keine Live-Ansicht ist, siehe this.

Etwas, das ruft funktionieren könnte:

status.invalidate(); 
+0

status.invalidate() funktioniert nicht, jedoch habe ich Ihre Anwsser als richtig markiert, da Sie erklärt, dass meine Ansicht nicht "live" ist – tensa11

1

Das kam aus der Tatsache, Android ist ein Betriebssystem-Nachrichten. Es gibt also einen Teil des Betriebssystems, der Nachrichten liest und Aktionen entsprechend der Reihenfolge in der Nachricht ausführt.

den Text in der Textview Refreshing wird durch diese Art und Weise geschehen: Wenn Sie setText() Code führen Sie eine Nachricht erstellen und an das Betriebssystem senden, ihm zu sagen: „Bitte aktualisieren Sie die Textview““

Wir können es. vereinfachen Sie die Erklärung, dass Sie 10 Briefe an einen Freund senden können, aber selbst wenn Sie die 10 Buchstaben zur gleichen Zeit senden, vielleicht werden sie nicht gleichzeitig ankommen ...

Und hier ist der Fall: für Android, Nachrichten für die Benutzeroberfläche sind keine "Priorität" Nachrichten. Aber App-Code hat eine hohe Priorität. So, wenn Sie die setText() ausführen, wird die Nachricht gesendet, aber das Betriebssystem liest es nicht als, nach dem setText () du pro Form große Code-Aktion. Also, das Betriebssystem führt deinen Code aus und erst wenn dieses riesige Stück Code fertig ist, sagt das Betriebssystem: "Oh, nun, vielleicht habe ich einen Brief bekommen", er öffnet den Brief und findet "Bitte aktualisiere den TextView". Also ... NACH Ihnen ein riesiges Stück Code.

Wie löst man das? Sie müssen Ihren riesigen Code in einen Handler stecken.

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

Dann:

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

Dies wird die Ausführung von Code von 100 Millisekunden verzögern, die nicht an ist enought den Prozess „langsam“ aber enought ist für Android die „Refresh setText“ zu lesen Botschaft.

0

Sie müssen dies tun:

status.setText("Some text"); 
    status.invalidate(); 
    status.requestLayout(); 
Verwandte Themen