Problem mit RelativeLayout, wenn View-Sichtbarkeit View.GONE ist

82

Ich habe eine RelativeLayoutso:

<RelativeLayout>
<TextView1/>
<TextView2/> // <-- View.VISIBLE OR View.GONE
<TextView3/>
<TextView4/>
</RelativeLayout>

Jeder TextViewist unter dem vorherigen TextViewmit verankert android:layout_below.

Das Problem ist, dass TextView2 möglicherweise vorhanden ist oder nicht (entweder View.VISIBLEoder View.GONE). Wenn ja View.VISIBLE, ist alles in Ordnung, aber wenn View.GONEja, wird TextView3 über TextView1 gerendert.

Ich habe verschiedene Möglichkeiten ausprobiert, um dies zu beheben, aber jedes Mal, wenn RelativeLayoutSie von 's' überrascht werden, können Sie nicht auf eine ID verweisen, bevor diese als 'Regel' definiert ist.

Ich hoffe, dass mir hier etwas Offensichtliches fehlt.

James
quelle
RelativeLayoutverfügt über einen eingebetteten Mechanismus zum Auffinden der nächstgelegenen Nicht-GONE-Ankeransicht. Ich habe bei Gingerbread nachgesehen und es ist sogar dort vorhanden: github.com/aosp-mirror/platform_frameworks_base/blob/…
Miha_x64

Antworten:

44

Sie können die Textansichten 2 und 3 im LinearLayout platzieren und das lineare Layout unter der Textansicht 1 beibehalten.

Karan
quelle
14
Das Hinzufügen einer Hierarchie zu einer Layoutdatei ist immer eine schlechte Idee, insbesondere wenn es sich um ein RelativeLayout handelt. Je mehr Sie hinzufügen, desto mehr Android erstellt Objekte, die Ihr Layout darstellen. Sie sollten stattdessen etwas wie android verwenden: layout_alignWithParentIfMissing = "true". Sie können auch andere Layouts wie beispielsweise TableLayout verwenden.
Francois Dermu
200

Sie können dieses Tag verwenden:

android:layout_alignWithParentIfMissing="true"

Aus den Dokumenten:

Wenn true festgelegt ist, wird das übergeordnete Element als Anker verwendet, wenn der Anker für layout_toLeftOf, layout_toRightOf usw. nicht gefunden werden kann.

ininprsr
quelle
24
Dies funktioniert nur, wenn die Ausrichtung mit dem übergeordneten Element gewünscht wird. Es wurde jedoch die Frage gestellt, wie die Ausrichtung mit der vorherigen Ansicht und nicht mit dem übergeordneten Element erfolgen soll.
Dimsuz
@dismuz, dies ist sehr nützlich bei der Verwaltung dynamischer Layouts und vermeidet Überraschungen in unvorhergesehenen Eckfällen.
Ininprsr
11

Warum nicht das belowAttribut von TextView3 aktualisieren, wenn Sie die Sichtbarkeit von TextView2 aktualisieren? (Ich nehme an, Sie tun dies im Code)

etwas wie

TextView tv = (TextView) findViewById(R.id.textview3);
RelativeLayout.LayoutParams lp =
    (RelativeLayout.LayoutParams) tv.getLayoutParams();
lp.addRule(RelativeLayout.BELOW, R.id.textview1);
((TextView) view).setLayoutParams(lp);
Slup
quelle
Was ist die "Ansicht"? Können Sie Ihren Code aktualisieren?
CDrosos
8

Diese Antwort löst nicht Ihr spezifisches Problem, sondern ein ähnliches. Hoffentlich hilft dies jemandem.

Ich hatte eine Situation, in der mein relatives Layout nicht dem von TextView1 entsprach. Wenn in meiner Situation TextView2 GEGANGEN war, wollte ich, dass TextView3 an der Oberseite des Elternteils ausgerichtet wird. Ich habe das gelöst, indem ich TextView3 das Attribut android hinzugefügt habe: layout_alignWithParentIfMissing = "true". Siehe http://developer.android.com/resources/articles/layout-tricks-efficiency.html .

Leider sehe ich keine Möglichkeit, einen alternativen Ausrichtungsanker anzugeben, es sei denn, es ist der übergeordnete Anker.

Samuel Yang
quelle
7

Vergessen Sie INVISIBLEoder GONE, verwenden Sie stattdessen Folgendes:

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) view.getLayoutParams();

params.height = 0;

params.setMargins(0,0,0,0);

view.setLayoutParams(params);
user925799
quelle
4

du kannst das

<RelativeLayout>
<TextView1/>
<FrameLayout>
  <TextView2/>  // <-- View.VISIBLE OR View.GONE
</FrameLayout>
<TextView3/>
<TextView4/>
</RelativeLayout>

Lassen Sie TextView3 unter diesem FrameLayout ohne Hintergrund. Wenn TextView2 also Gone ist, belegt es keinen Platz.

Alittle927
quelle
1

Platzieren Sie alle Textansichten mit vertikaler Ausrichtung unter LinearLayout.

<LinearLayout>
<TextView/>
<TextView/>
<TextView/>
<TextView/>
<TextView/>
<TextView/>
</LinearLayout>
Ashwini
quelle
-3

Ein einfacher Hack dafür ist, mit Alpha 0/1 zu spielen. und deaktivieren Sie auch den onClickListener, falls vorhanden

Taldroid
quelle
Dadurch bleibt der unnötige Platz belegt.
Henrique Monte