2012-10-13 14 views
7

Ich erstelle ein Raster, das Werte anzeigt, die sich sehr oft ändern. Aus diesem Grund benutze ich eine TextView, die automatisch aktualisiert, wenn sich ihr Inhalt ändert (Auto Scale TextView Text to Fit within Bounds). Die Resize erfolgt, aber die Aussicht Layout nicht richtigLayout einer Ansicht nach der Größenänderung

layout after resize

Die Sache ist, wenn ich die Aktivität mit HierarchyViewer den Layout-Displays untersuchen, wie ich will.

layout after hierarchyviewer

Meine Vermutung ist, dass HierarchyViewer ruft requestLayout() oder() in der Ansicht ungültig machen, aber ich habe versucht, dass ohne Erfolg. Dieser Code wird in der Hauptaktivität ohne Auswirkung aufgerufen.

new Handler().postDelayed(new Runnable() {    
      @Override 
      public void run() { 
       getWindow().getDecorView().requestLayout(); 
       getWindow().getDecorView().invalidate(); 
      } 
      }, 5000); 

Ich habe auch versucht, die Ansicht nach der Größenänderung ungültig zu machen.

Der TextView hat gravity auf Center eingestellt, und wenn keine Größenänderung stattfindet, sieht es ok aus.

Jeder Hinweis wird willkommen sein, danke im Voraus!

+0

Haben Sie versucht, das Layout in der übergeordneten Ansicht und nicht in der Dekoransicht anzufordern? – DeeV

+0

Ist die Dekoransicht nicht der Elternknoten des Ansichtsbaums? Ich habe gelesen, dass die Anforderung des Layouts in einer Ansicht dazu führt, dass alle untergeordneten Elemente das Layout anfordern. Wie auch immer, ich würde sagen, dass ich das versucht habe, da ich viele Dinge ausprobiert habe, aber ich melde mich zurück, wenn ich deine Vorschläge ausprobiere. Angeben der requestLayout-Dokumente in der view.View, "Rufen Sie dies auf, wenn sich etwas geändert hat, was das Layout dieser Ansicht ungültig gemacht hat. Dadurch wird ein Layout-Durchlauf der Ansichtsstruktur geplant." – Maragues

+0

Es tut, aber ich kann nichts mit Ihrem Code falsch sehen. requestLayout() layouts eine Elternansicht und es sind Kinder, aber ich habe es nur auf Ansichten direkt von meiner App gesteuert, so ist es nur ein Gedanke. – DeeV

Antwort

2

Ich löste sie durch zwingende onLayout- in einem der Elterntextview und einen Handler im Konstruktor erstellt mit

public class CellView extends LinearLayout{ 
    public CellView(Context context) { 
    super(context); 

    mHandler = new Handler(); 

    View.inflate(context, R.layout.cellview, this); 
    } 

@Override 
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 
    if(changed){ 
     mHandler.post(new Runnable() {   
     @Override 
     public void run() { 
      requestLayout(); 
     } 
     }); 
    } 

    super.onLayout(changed, left, top, right, bottom); 
    } 

Ich hatte versucht, requestLayout innerhalb Textview die onLayout- nennen, tho es nicht funktioniert, ich bin nicht sicher warum. Das liegt möglicherweise daran, dass der Wert über einen Observer aktualisiert wurde, aber der onTextChanged-Listener sollte im UI-Thread auftreten. Ich hoffe, es dient jemand anderen

0

Sie müssen wahrscheinlich den Timer-Code im UI-Thread unter Verwendung von runOnUiThread wie erläutert here ausführen.

+0

Wenn er den Handler im UI-Thread erstellt, wird er im UI-Thread ausgeführt. – DeeV

+0

Ich werde das später überprüfen (momentan nicht daran arbeiten). Ich würde sagen, dass das Ausführen des Codes außerhalb des UI-Threads eine Ausnahme verursachen würde, aber ich könnte den Handler außerhalb des UI-Threads erstellen. Danke an beide (Narcís und DeeV) für die Idee – Maragues

2

Die Art und Weise requestLayout() funktioniert ist, dass, wenn auf einer Ansicht aufgerufen wird, wird es planen ein Layout auf sich selbst und alle seine Kinder planen. Dies ist immer dann wünschenswert, wenn eine Ansicht verschoben oder in der Größe geändert wurde, z. B. bei Rand-, Füll- oder Inhaltsänderungen.

Die Dokumentation über die Methode getDecorView() ist nicht sehr klar, was genau es Ihnen gibt. Jedoch gemäß der Dokumentation auf der website:

Beachten Sie, dass diese Funktion zum ersten Mal „Sperren in“ verschiedenen Fenster Eigenschaften aufrufen wie in setContentView (Ansicht, android.view.ViewGroup.LayoutParams) beschrieben.

Das lässt mich glauben, dass es etwas Besonderes an der Ansicht gibt, die getDecorView() abruft. Was Sie wahrscheinlich tun, ist, das Layout der Ansicht permanent zu machen und sich so nie zu verändern, wenn Sie einen requestLayout() Pass machen.

This is apparently the proper way to get the root view of your entire activity.

jedoch aus Effizienzgründen empfehle ich requestLayout() auf dem niedrigsten Kind rufen Sie können. Wie ich schon sagte, es plant einen Layout-Durchlauf auf eine Ansicht und es sind Kinder. Wenn Sie in der obersten Ansicht einen Layout-Durchlauf durchführen, erstellen Sie alles, was die Ansichten enthält, die beibehalten werden.

+0

da bist du, danke für deine Zeit und schöne Recherche auf AnfrageLayout, tho werde ich meine als ausgewählte Antwort behalten da sie mein spezifisches Problem angeht. Wenn die Nutzer in Zukunft Ihre Stimme wählen, werde ich sie Ihnen zuweisen – Maragues

Verwandte Themen