2016-04-05 16 views
1

Ich habe folgenden einfachen Layout. Das Problem kann im Android Studio Designer reproduziert werden:RelativeLayout Ansicht nach rechts von TextView

<?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/x" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerVertical="true" 
    android:layout_marginEnd="@dimen/margin_small" 
    android:layout_marginRight="@dimen/margin_small" 
    android:text="@string/long_string" 
    android:textAppearance="?android:attr/textAppearanceSmall"/> 
<CheckBox 
    android:id="@+id/y" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_toRightOf="@+id/x" 
    android:layout_toEndOf="@+id/x" 
    android:layout_centerVertical="true" /> 

</RelativeLayout> 

Dieses Layout funktioniert gut, wenn die Textlänge der Textview kurz ist. Das Kontrollkästchen befindet sich auf der rechten Seite der Textansicht. Wenn der Text jedoch lang wird und sich vielleicht sogar umschließt, wird das Kontrollkästchen aus der Ansicht entfernt. Es ist nicht mehr sichtbar. Ich möchte, dass die Checkbox immer rechts von der Textansicht sichtbar ist, auch wenn sie die gesamte Breite des Bildschirms ausfüllt.

Ich habe versucht, das Layout mit einem LinearLayout neu zu schreiben, das auch nicht funktioniert.

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

<TextView 
    android:id="@+id/x" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginEnd="@dimen/margin_small" 
    android:layout_marginRight="@dimen/margin_small" 
    android:text="@string/long_string" 
    android:textAppearance="?android:attr/textAppearanceSmall"/> 
<CheckBox 
    android:id="@+id/y" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    /> 

</LinearLayout> 

Kennen Sie einen Trick, um dies mit relativ Layout zu erreichen? Ich würde dieses Verhalten irgendwie vom relativen Layout erwarten. Dank;)

Antwort

1

sein Dies ist für mich arbeiten: checkBox alignParentRight und machen Textview toLeftOf es:

<?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/x" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerVertical="true" 
     android:layout_toLeftOf="@+id/y" 
     android:text="This is very-very-very looooooooooooong stringgggg, very-very, long-long" 
     android:textAppearance="?android:attr/textAppearanceSmall"/> 
    <CheckBox 
     android:id="@+id/y" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerVertical="true" 
     android:layout_alignParentRight="true"/> 

</RelativeLayout> 

Bearbeiten. Sie können dieses Relative-Layout in andere (übergeordneten) Layout umfassen:

<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_centerVertical="true" 
     android:gravity="left"> 

     <TextView 
      android:id="@+id/x" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_centerVertical="true" 
      android:layout_toLeftOf="@+id/y" 
      android:text="this is veryyyyy yyyyyyyyyy yyyyyy yyy loooooo oooooooo ooon nnggggg gggg striiii iiiiin gggggg ggggg ggggggg ggg" 
      android:textAppearance="?android:attr/textAppearanceSmall"/> 
     <CheckBox 
      android:id="@+id/y" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentRight="true" 
      android:layout_alignParentEnd="true" 
      android:layout_centerVertical="true" />  

    </RelativeLayout> 

</RelativeLayout> 

Es ist auch zu arbeiten. Wenn Sie android: gravity = "left" in Relatives Layout setzen, wird der Inhalt auf der linken Seite angezeigt.

+0

Ich bin mir dieser Möglichkeit bewusst, aber wie ich fragte, ich möchte das Kontrollkästchen auf der rechten Seite der Textansicht nicht auf der rechten Seite, weil dieses Layout funktioniert nicht gut auf Tabletten mit einem großen Bildschirm. Denn mit kurzen Strings wären die beiden Elemente zu stark getrennt. –

+0

Ok, Sie können dieses relative Layout als separates Element (Ansicht) nehmen und es in Ihre übergeordneten Layouts aufnehmen. –

+0

Ich verstehe nicht, was du meinst. Könnten Sie das klären? Wenn Sie dieses Layout in eine übergeordnete Ansicht einbeziehen, ändert sich nichts daran. –

1

Sie die Eigenschaft layout_weight setzen sollten Ihre Ansichten (Textview und Kästchen zum Ankreuzen) einen deff Platz auf dem Bildschirm statt Verwendung ein harter Wert

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:orientation="horizontal"> 

    <TextView 
     android:id="@+id/x" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_weight="0.9" 
     android:layout_marginEnd="@dimen/margin_small" 
     android:layout_marginRight="@dimen/margin_small" 
     android:text="@string/long_string" 
     android:textAppearance="?android:attr/textAppearanceSmall"/> 
    <CheckBox 
     android:id="@+id/y" 
     android:layout_weight="0.1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     /> 

    </LinearLayout> 
+0

Danke, aber das hat im Grunde den gleichen Effekt, als wenn ich das Kontrollkästchen ausrichten Eltern rechts, und das Textfeld links davon. Das Ergebnis ist also auf Smartphones und Tablets nicht zufriedenstellend. I der Text ist kurz, dann ist das Kontrollkästchen fast Elternteil rechts, aber nicht auf der rechten Seite der Textansicht. –

1

Ein Ausweg wäre, setzen die machen Textansicht und Kontrollkästchen in einem linearen Layout mit horizontaler Ausrichtung. Stellen Sie Breite von Kontrollkästchen sein, was auch immer Sie (eine Konstante) wollen und die Breite der Textbox 0DP und layout_weight von 1.

+0

Danke, aber das ist im Grunde das gleiche wie die anderen beiden Antworten. Wenn ich dieses Layout haben wollte, würde ich ein relatives Layout mit der Checkbox align eltern rechts machen. –

0

Ich denke, das gewünschte Layout ist standardmäßig nicht möglich. Ich habe versucht, dies mit RelativeLayout, LinearLayout und TableLayout zu tun. Es ist technisch verständlich, dass diese Layouts dieses Verhalten nicht unterstützen. Das relative Layout müsste explizit den Fall berücksichtigen, dass ein Element auf der linken oder rechten Seite innerhalb des Elternelements minimal sichtbar ist, auch wenn es links oder rechts platziert ist. Eine andere Lösung wäre, wenn das Tabellenlayout einer Spalte erlauben würde, den Rest des Raums zu verbrauchen, aber auch die minimale Breite anderer Spalten berücksichtigt.

Für meinen Fall habe ich einen Workaround geschrieben. Ich benutzte die anfängliche relative Layout meiner Frage, sondern setzen eine maximale Breite auf die Textview folgendermaßen berechnet:

DisplayMetrics displaymetrics = new DisplayMetrics(); 
    context.getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); 
    int displayWidth = displaymetrics.widthPixels; 

dass das Kontrollkästchen sichtbar sein garantiert. Ich weiß, dass die Lösung in Szenarien, in denen das gegebene Layout in ein komplexeres Layout eingebettet ist, kaum möglich ist.

Verwandte Themen