2016-05-13 10 views
0

Related question. Antwort: RelativeLayout kann es nicht tun. Ich frage, wie man es trotzdem macht, mit nicht nur RL, oder mit etwas anderem.Wie wird die Ansicht (wie in RelativeLayout) mit einer Neffe-Ansicht ausgerichtet?

Allgemeine Geschichte: Sie haben ein komplexes Layout, das schwer zu justieren wäre, und mit der Aufforderung, etwas hinzuzufügen, das auf eine verschachtelte Ansicht ausgerichtet ist.
enter image description here

Was ist der beste Ansatz? Ein Popup mit einem benutzerdefinierten Stil? (noch nicht vertraut mit denen)? Ausgaben Tage ändern die gesamte Hierarchie zu einem einzigen RelativeLayout? Eine benutzerdefinierte Layout-Klasse als Wrapper?
AbsoluteLayout (veraltet) oder FrameLayout mit programmgesteuert geändert LayoutParams oder Margen? (dies würde ich lieber vermeiden, ich möchte nicht aufMeasure tippen, usw.)

Vereinfachtes Beispiel (keine Beziehung zu Bild oben):
LinearLayout definiert relative Höhen der Elemente. Ich weiß es nicht mit RelativeLayout.
anExpandableView ist etwas zu animieren, wie unter someBar (hier, volle Breite, aber vielleicht muss es seine Breite sowie vertikale Position ausrichten müssen) zu gleiten.

<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:animateLayoutChanges="true"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical"> 

     <include 
      android:id="@+id/topStuff" 
      layout="@layout/incl_topstuff" 
      android:layout_width="match_parent" 
      android:layout_weight="7" 
      android:layout_height="0dip" /> 

     <include 
      android:id="@+id/someBar" 
      layout="@layout/incl_filters_and_stuff" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" /> 

     <include 
      android:id="@+id/bottomStuff" 
      layout="@layout/incl_bottomstuff" 
      android:layout_width="match_parent" 
      android:layout_height="0dip" 
      android:layout_weight="10" /> 

    </LinearLayout> 

    <include 
     android:id="@+id/anExpandableView" 
     layout="@layout/incl_filters" 
     android:visibility="gone" 
     android:layout_below="@id/someBar"/> 

</RelativeLayout> 

Ich weiß, SO hat eine Abneigung gegen allgemeine Fragen haben, aber ich weiß nicht eine Ad-hoc-Lösung wollen. Ich frage, was in Fällen zu tun wäre, die gelöst würden, wenn nur ein Wrapping RelativeLayout die Ausrichtung zu einer Ansicht erlauben würde, die kein direktes Geschwister ist.

+0

Vielleicht könnten Sie ein grafisches Diagramm von dem, was Sie möchten, um Ihre Ansicht aussehen ... – Elye

+0

Ich wusste es, eine Nachfrage für einen bestimmten Fall. Nein, ich lehne ab. Ich möchte das Äquivalent von 'layout_alignBottom' oder' layout_below' usw. machen, wobei ich nicht auf eine Geschwisteransicht referenziere, sondern etwas, das tiefer geschachtelt ist. Ich habe 'include' verwendet, weil es nicht wichtig ist, was die Ansichten sind, nur was" anExpandableView "positionieren muss. Wenn Sie Verständnisprobleme haben, zeigen Sie bitte auf den unklaren Teil. – kaay

+0

Der erste Satz selbst ist bereits sehr kryptisch 'Sie haben ein komplexes Layout und eine Aufforderung, etwas hinzuzufügen, das auf eine verschachtelte Ansicht ausgerichtet ist. Was meinst du mit komplexes Layout? Eine Ansicht kann als geschachtelt betrachtet werden oder nicht, je nachdem, welches Layout sie verwendet ... daher ist es ohne den richtigen Kontext schwierig, die Frage zu verstehen. Wenn ein "grafisches Diagramm" uns dazu bringen würde, Ihnen eine starre Antwort zu geben, könnten Sie vielleicht zwei oder mehr Diagramme zur Verfügung stellen, um die allgemeine Idee zu beschreiben. – Elye

Antwort

1

Einfach ausgedrückt, RelativeLayout kann nur seine direkten Kinder basierend aufeinander messen und layouten, aber ich nehme an, Sie wussten das bereits.

Die einzige allgemeine Lösung wäre, Ihre eigene benutzerdefinierte Layout-Klasse zu implementieren, die ich nicht empfehlen würde. Wenn ich raten müsste, warum RelativeLayout nicht die gesamte Layout-Hierarchie auf der Ebene und darunter durchläuft, liegt das wahrscheinlich an der Leistung.

Leider, wenn Sie RelativeLayouts und LinearLayouts verwenden und Ansichten voneinander abhängig sein sollen, müssen Sie einen Ansatz wählen und dabei bleiben, entweder die flache Hierarchie von RelativeLayout oder die verschachtelte von LinearLayout.

Basierend auf Ihrem Beispiel, gibt es meines Wissens keine Möglichkeit, gewichtete Ansichten mit einem RelativeLayout zu implementieren, so dass Sie kein LinearLayout verwenden müssen.

Der einfachste Weg, um das zu tun, was Sie wollen, ist, Ihren expandableView im Code aufzublasen, ihn mit dem unteren Rand des RelativeLayouts auszurichten, seine Höhe und Position basierend auf bottomStuff festzulegen und von dort zu animieren.

Wenn Sie es wirklich in xml machen wollen, kann ich an einen etwas hacky, ad-hoc-Ansatz denken, der aber verallgemeinert werden kann, um die Messung und das Layout jeder Hierarchie mit ein wenig Arbeit zu spiegeln.

Erstellen Sie ein paralleles aber unsichtbares LinearLayout, das ein Geschwister des ersten ist. Geben Sie ihm eine leere Ansicht mit Gewicht 7 oben, eine unsichtbare Kopie von someBar in der Mitte, dann Ihre erweiterbare Ansicht darunter mit Gewicht 10. Um es nach oben gleiten zu lassen, animieren Sie entweder die Höhe des unsichtbaren somebar und das Gewicht des leeren Zeige oben auf 0, oder entferne sie/setze sie auf und setze animateLayoutChanges auf deiner LinearLayout.

+0

Vielen Dank. Re: "Einen Ansatz auswählen" - "LinearLayout" kann nicht ausgerichtet werden. 'RelativeLayout' kann keine Gewichte machen. Ich brauche ein bisschen von beidem. Für den Moment mache ich die Ansicht "weg" und programmiere Ränder. Kennen Sie einen besseren Weg, die Koordinaten einer Ansicht zu erhalten, als rekursiv Werte von 'getTop()' der Ansicht und jedem Vorfahren hinzuzufügen? – kaay

+0

BTW, ich glaube nicht, dass Leistung der Grund war. findViewByID ist sehr häufig und ich muss noch jemanden sehen, der sich um die Optimierung kümmert. Wahrscheinlicher war es, zirkuläre Referenzen zu vermeiden. – kaay

+1

Sie können View.getGlobalVisibleRect verwenden und sie von der übergeordneten Ansicht, für die Sie Koordinaten erhalten möchten, versetzen oder die Größe der Ansicht von der rect abfragen, anstatt rekursiv relative Offsets hinzuzufügen. Stellen Sie dann die Höhe und Breite über RelativeLayout.LayoutParams ein. Ich bin nicht sicher, warum Sie Ränder einstellen und die Höhe oder die Position nicht direkt einstellen würden. Verwenden Sie insbesondere View.getGlobalVisibleRect auf bottomStuff, holen Sie die Höhe von der rect top und bottom, und stellen Sie das auf die Höhe von Ihrem expandableView, mit erweiterbarenView auf alignParentBottom. –

Verwandte Themen