Stoppen Sie Android vom Layout aller meiner Ansichten

8

Ich entwickle gerade eine Tablet-App, die das ViewPager Widget intensiv nutzt. Ich habe auch mehrere Viewpager auf dem Bildschirm auf einmal.

Jetzt habe ich folgendes Problem: Wenn ein ViewPager zur nächsten / vorherigen Seite scrollt, muss er (natürlich) sein Layout neu berechnen und Ansichten hinzufügen / entfernen. Ich habe bemerkt, dass requestLayout direkt an die Spitze der Ansichtshierarchie aufruft und daher ALLE meiner Ansichten auf dem Tablet-Bildschirm ungültig macht (was eine Menge ist!). Das ist sehr teuer .

Meine Frage lautet nun: Gibt es eine Möglichkeit, einen Rahmen um den ViewPager zu implementieren, der das anfängliche Layout ausführt und dann Layoutanforderungen nicht in der Ansichtshierarchie hochfährt , wie ich das nach der Initiale weiß Layout, der Rahmen bleibt gleich groß und ändert sich nicht.

Ich habe das folgende Frame entwickelt, aber es funktioniert nicht ganz gut, weil es nicht zu 100% funktioniert.

%Vor%

Danke für irgendeinen Rat!

    
saberrider 26.03.2012, 08:33
quelle

2 Antworten

4

Ich weiß, dass die Frage ein wenig alt ist, aber meine Antwort könnte jemand anderem helfen, da Ihre Frage und Colins Antwort mir geholfen haben.

Ich habe genau das gleiche Problem wie du. Und dafür gibt es zwei Lösungen. Zuerst müssen Sie sicherstellen, dass Ihr ViewPager seine * layout_width * und * layout_height * auf * match_parent * gesetzt hat, und diese Ansichtshierarchie ist so organisiert, dass Android nicht zu dem Schluss kommt, dass es irgendwelche neu zu layern braucht der übergeordneten ViewPager-Layouts. Angenommen, Sie haben ein RelativeLayout mit zwei Ansichten von festen Größen untereinander und einem ViewPager unterhalb der zweiten Ansicht. In diesem Fall wird jede Änderung an ViewPager an das übergeordnete Layout weitergegeben. Wenn Sie diese beiden Ansichten mit fester Größe und den ViewPager jedoch in ein LinearLayout einfügen, wird dies nicht passieren. Keine Layoutanforderung wird über ViewPager hinaus verbreitet. Was noch besser ist, Layout-Anfragen auf einer ViewPager-Seite werden auch nicht auf andere Seiten übertragen.

Die zweite Lösung (eigentlich ist es mehr der zweite Teil der Lösung) ist Ihr FrameLayout, aber wie folgt modifiziert:

%Vor%

In meiner Anwendung rufe ich setPropagateRequestLayout () in den Methoden Fragment onStart und onStop auf, um Layout-Anforderungen zu aktivieren bzw. zu deaktivieren.

    
anqe1ki11er 03.12.2013 09:19
quelle
0

Ich wünschte wirklich, ich könnte dir sagen, dass es einen besseren Weg gibt, aber ich denke nicht, dass es da ist. Wenn der ViewPager tatsächlich Ansichten hinzufügt / löscht, wird Ihr Layout fortlaufend gelöscht, auch wenn es nicht möglich ist. Es ist eine träge Annahme, dass sich der Inhalt ändern könnte (und somit nach oben hin ungültig wird), und es liegt an uns, knifflige Programme, um einige dieser Annahmen zu entfernen.

Wenn Sie sicherstellen können, dass sich die Grenzen von FrameLayout niemals ändern, können Sie requestLayout überhaupt nicht überschreiben.

    
Colin Godsey 10.04.2012 22:29
quelle