2013-05-12 10 views
12

Ist es möglich, eine Ansicht in XML in einer RelativeLayout-zentrierten horizontalen oder vertikalen nach einer anderen bereits vorhandenen Ansicht auszurichten.RelativeLayout: align Ansicht zentriert horizontal oder vertikal relativ zur anderen Ansicht

Zum Beispiel: Es kann sagen, dass es so etwas wie diese:

enter image description here

Die zweite Textansicht angezeigt werden soll unter der ersten Textansicht zentriert:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <TextView 
     android:id="@+id/textView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_marginLeft="72dp" 
     android:text="dynamic text" /> 

    <TextView 
     android:id="@+id/second" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@id/textView" 
     android:layout_marginLeft="43dp" <!-- Is there a rule to center it? --> 
     android:text="centered below text 1" /> 

</RelativeLayout> 

Ist möglich zu implementieren so etwas in XML? Gibt es eine Regel, die ich schon verpasst habe? Ich will nicht die Position programmatisch die folgenden

Antwort

12

ein separates Eltern Layout für diese Ansichten verwenden und fügen Sie es in Ihrem Haupt-Layout (können andere Dinge enthalten, wenn Sie haben)

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 
    <LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     android:gravity="center" 
     android:layout_marginLeft = "30dp"> 
     <TextView 
      android:id="@+id/textView" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="dynamic text" /> 

     <TextView 
      android:id="@+id/second" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="centered below text 1" /> 
    </LinearLayout> 
... 
... 
other veiws go here 
... 

</RelativeLayout> 
+14

Nein, ich möchte es nicht in Eltern zentrieren – sockeqwe

+0

Wie Sie es brauchen – Noundla

+0

Ich habe die Antwort geändert. überprüfe es einmal. – Noundla

4

verwenden berechnen, die zu Ihnen passt

android:layout_centerHorizontal="true" 
    android:layout_centerInParent="true"  
    android:layout_centerVertical="true"  
+4

Nein, ich es in Eltern nicht zum Zentrum will ... ich will es zum Zentrum unterhalb oder oberhalb einer bestimmten anderen Ansicht. Zum Beispiel: Die andere Ansicht hat eine marginLeft = "72dp" – sockeqwe

+0

ja einfach centerhoarizontal = true und diese Ansicht über oder unter eine andere setzen – stinepike

+0

Hm, vielleicht irre ich dich, aber beim Anwenden zentriert das die zweite Textansicht im Parent. Aber ich möchte, dass es unter der anderen Ansicht zentriert ist, also relativ zur ersten Ansicht zentriert, was ich will ... Ich denke, das könnte durch Umhüllen dieser zwei Ansichten in ein anderes RelativeLayout – sockeqwe

0

Sie this->

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <TextView 
     android:id="@+id/textView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:text="dynamic text" /> 

    <TextView 
     android:id="@+id/second" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/textView" 
     android:layout_centerHorizontal="true" <!-- Is there a rule to center it? --> 
     android:text="centered below text 1" /> 

</RelativeLayout> 
0

fand ich das so lution: Wickeln Sie den Inhalt in einer anderen RelativeLayout und dann können Sie diesen LayoutWrapper platzieren, wo immer Sie wollen:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <RelativeLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:layout_marginLeft="58dp" 
     android:layout_marginTop="58dp" > 

     <TextView 
      android:id="@+id/textView" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentTop="true" 
      android:layout_centerInParent="true" 
      android:text="dynamic text" /> 

     <TextView 
      android:id="@+id/second" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_below="@+id/textView" 
      android:layout_centerInParent="true" 
      android:text="centered below text 1" /> 
    </RelativeLayout> 

</RelativeLayout> 
20

Ich habe eine viel bessere Lösung als die akzeptierte ein. KEINE EXTRA NESTING! Sie können dies tun, indem Sie zwei Attribute auf der kleineren Ansicht kombinieren. Wenn Sie horizontal zentrieren, können Sie sowohl align_start & align_end zur größeren Ansicht verwenden. Stellen Sie sicher, dass der Text der Schwerkraft zentriert btw.. „Android: Schwerkraft =“ center“für die vertikale Ausrichtung Verwendung sowohl align_top & align_bottom unten ist die modifizierte Ausführung des Layouts

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingLeft="43dp" > 

<TextView 
    android:id="@+id/textView" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignStart="@+id/second" 
    android:layout_alignEnd="@+id/second" 
    android:gravity="center" 
    android:text="dynamic text" /> 

<TextView 
    android:id="@+id/second" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_below="@id/textView" 
    android:gravity="center" 
    android:text="centered below text 1" /> 

</RelativeLayout> 

Keine Notwendigkeit für unnötige Verschachtelung wie angenommen. Antwort.

+0

Ja, aber das funktioniert nur, wenn Sie die Breite der Textansicht kennen, um den Rand anzupassen. – sockeqwe

+0

Es gibt keine Notwendigkeit für Marge .... Die Marge dort ist, was Sie ursprünglich hatten. Was passiert, ist, dass die Breite des kleineren Texts gleich dem größeren Text ist, und indem das Gravitationszentrum verwendet wird, wird die Ansicht relativ zu der größeren Textansicht zentriert. Um dies zu überprüfen, passen Sie den Rand der zweiten Textansicht oder den Inhalt des Textes an und beobachten Sie auch die erste Bewegung. – Jessicardo

+0

Ich habe auch den expliziten Rand entfernt, den Layout-Container aufgefüllt und das Layout aktualisiert. – Jessicardo

0

Richtige Lösung ist ConstraintLayout

ich unten ein Button in einem RelativeLayout eine Textview horizontal auszurichten versucht, zu verwenden, aber es war nicht möglich, da align_bottom und layout_below nicht gut zusammen spielte. Schließlich i pi cranked up constraintLayout und versuchte die gleiche Logik und es funktionierte wie ein Charme. Hier ist der Code unten.

<android.support.constraint.ConstraintLayout 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:clipChildren="false" 
xmlns:android="http://schemas.android.com/apk/res/android"> 

<Button 
    android:id="@+id/episode_recording_header_stop" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="@mipmap/ic_launcher" 
    app:layout_constraintBottom_toBottomOf="parent" 
    app:layout_constraintEnd_toEndOf="parent" 
    app:layout_constraintStart_toStartOf="parent" 
    app:layout_constraintTop_toTopOf="parent" 
    app:layout_constraintVertical_bias="0.399" /> 


<TextView 
    android:id="@+id/button_selected_text" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_margin="8dp" 
    android:textAlignment="center" 
    android:textColor="@android:color/black" 
    android:textSize="12sp" 
    android:text="text which is exactly center aligned w.r.t the Button above" 
    app:layout_constraintEnd_toEndOf="@+id/episode_recording_header_stop" 
    app:layout_constraintStart_toStartOf="@+id/episode_recording_header_stop" 
    app:layout_constraintTop_toBottomOf="@+id/episode_recording_header_stop" 
    /> 

</android.support.constraint.ConstraintLayout> 

Der endgültige Ausgang angeschlossen ist unter

enter image description here

+0

Wie Sie sehen können, ist die Ausrichtung w.r.t die Ankeransicht (Schaltfläche) und nicht die übergeordnete oder eine andere Ansicht. –

+0

Ja, verwenden Sie nur ConstraintLayout, da es erlaubt, so etwas zu tun (RelativeLayout nicht) ... – sockeqwe

+0

@sockeqwe Die angenommene Antwort beantwortet die Frage nicht richtig? Außerdem brauchte ich einige Zeit, um zu erkennen, dass eine horizontale Ausrichtung einer Ansicht in RelativeLayout nicht möglich ist. Die richtige Antwort ist ConstraintLayout für jetzt zu verwenden. –