TextView

时间:2016-04-05 16:52:42

标签: android android-layout android-relativelayout

我遵循了简单的布局。这个问题可以在android studio designer中重现:

<?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>

如果textview的文本长度很短,则此布局可以正常工作。该复选框位于textview的右侧。但是如果文本变长甚至包装可能,那么复选框将被推出视图。它不再可见了。如果填充整个屏幕宽度,我希望文本视图右侧的复选框始终可见。

我尝试使用LinearLayout重写布局,但也没有。

<?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>

您是否知道通过相对布局实现此目的的技巧?默认情况下,我会以某种方式从相对布局中预期此行为。谢谢;)

4 个答案:

答案 0 :(得分:1)

你应该把属性layout_weight设置为使你的视图(TextView和Checkbox)在屏幕上有一个deff空间而不是使用硬值

<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>

答案 1 :(得分:1)

一种方法是将textview和checkbox放在水平方向的线性布局中。将复选框的宽度设置为您想要的任何值(常量),文本框的宽度为0dp,layout_weight为1。

答案 2 :(得分:1)

这对我有用:make checkBox alignParentRight并使TextView toLeftOf:

<?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>

编辑。您可以将此相对布局包含在其他(父级)布局中:

<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>

它也有效。如果你将android:gravity =“left”放入相对布局中,它将在左侧找到它的内容。

答案 3 :(得分:0)

我想默认情况下无法实现所需的布局。我尝试使用RelativeLayout,LinearLayout和TableLayout来做到这一点。技术上可以理解的是,这些布局不支持该行为。相对布局必须明确地尊重左侧或右侧的元素在父级内部可见的最小情况,即使它被放置在左侧或右侧。另一个解决方案是,如果表格布局允许列占用剩余的空间,但也要考虑其他列的最小宽度。

对于我的情况,我写了一个解决方法。我使用了问题的初始相对布局,但使用以下计算将最大宽度设置为textview:

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

这可以保证复选框可见。我知道在给定布局嵌入更复杂布局的情况下,解决方案几乎不可能。