Das Hinzufügen von Ansichten dynamisch in einer for-Schleife führt zu einer zufälligen Positionierung - Android

8

Ich füge dynamisch Ansichten zu einem relativen Layout (sagen wir Container) in einer for-Schleife hinzu. Es gibt etwas Seltsames, das ich bemerke.
Beim Hinzufügen von Zeilen untereinander in einem relativen Layout in einer for-Schleife sieht das erste Mal vor, dass sich einige der Ansichten überlappen. Aber wenn ich den Bildschirm sperre und entsperre, kann ich sehen, dass die Ansichten korrekt platziert sind.

Sollte ich etwas bemerken, wenn ich Ansichten dynamisch zu einem relativen Layout hinzufüge?

Bearbeiten
Ich habe eine Lösung gefunden, wie ich das loswerden kann (bitte überprüfe meine Antwort). Aber ich wäre mehr als froh, eine Antwort zu akzeptieren, die dieses Problem analysiert und mir sagt, warum das passiert Ich habe den Code vereinfacht und die Kommentare sollten eine gute Vorstellung davon geben, was ich mache.

%Vor%     
Ashwin 11.05.2015, 12:06
quelle

5 Antworten

4

Dies liegt daran, dass Sie RelativeLayout mit height als WRAP_CONTENT haben und das Hinzufügen einer Ansicht den gesamten Container zu diesem Zeitpunkt nicht aktualisiert. Wenn Sie also geantwortet haben, können Sie eine hinzufügen Linie zu measure die Dimensionen explizit oder invalidate die Ansicht, um es vollständig neu zu erstellen.

In jedem Fall wäre LinearLayout besser zu wählen, da es automatisch die Kinder in horizontal oder vertical Weise anordnet und Sie können die neue Ansicht sogar an einer anderen Stelle als der letzten Position hinzufügen automatisch aktualisiert werden.

    
Ankit Bansal 14.05.2015 07:31
quelle
1

Ich habe mich vor einem Jahr gegen gängige Probleme gewehrt, als ich an einer Bibliothek arbeitete, um dynamisch Layouts aus XML-Dateien zu erstellen (wie Android dies nicht unterstützt). Wenn Sie also einem RelativeLayout dynamisch Ansichten hinzufügen, müssen Sie einige Dinge beachten:

  1. Erstellen Sie den Container View (in diesem Fall RelativeLayout )
  2. Erstellen Sie alle Ansichten, ohne Layoutparameter zuzuweisen.
  3. Fügen Sie dem Container alle untergeordneten Ansichten hinzu.
  4. Iteriere über die Child-Objekte des Containers und befülle die Layout-Parameter für jedes Kind. Dies ist erforderlich, da bei Verwendung der relationalen Abhängigkeiten ein Excpetion ausgelöst wird, wenn die relative View fehlt (wurde dem Container zuvor nicht hinzugefügt).

Dies ist ein Beispielcode aus dem Projekt, mit dem ich gearbeitet habe. Beachten Sie, dass es sich nur um ein einzelnes Teil handelt, das Verweise auf Klassen enthält, die nicht in der Android-API definiert sind. Ich bin mir sicher, dass es Ihnen die Grundidee gibt, RelativeLayot dynamisch zu erstellen:

%Vor%     
Kiril Aleksandrov 14.05.2015 07:47
quelle
0

Fügen Sie Ihre Ansichten im vertikalen linearen Layout hinzu. Der folgende Link könnte Ihnen helfen

Ссылка

Füllen Sie Ihr Layout in einer for-Schleife auf.

    
Nabil Malik 11.05.2015 14:27
quelle
0

Ich habe noch nicht die Antwort gefunden, warum das passiert. Aber ich habe eine Lösung gefunden. Rufen Sie nach dem Hinzufügen jeder Zeile in der Schleife container.measure(RelativeLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.WRAP_CONTENT); auf Dies scheint das Problem zu lösen. Aber ich denke wirklich, dass container.addView() auch measure() aufrufen sollte.

%Vor%     
Ashwin 12.05.2015 10:01
quelle
0

%Vor%
    
debug.error 20.05.2015 19:33
quelle

Tags und Links