Android对齐多个TextView-s

时间:2015-05-17 18:34:59

标签: android android-layout textview alignment relativelayout

我想在一行中对齐多个(变量)textviews。它应该是这样的:

- Textview1 | Textview2 | TextView3

由于textviews在长度方面有所不同,我在调整它们时遇到了问题(我唯一知道的是Textview1将是最短的)。

这是我的代码(它放在线性布局中):

        <RelativeLayout
            android:id="@+id/persondetails_names_horizontal_container"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="right"
            android:gravity="right" >

            <TextView
                android:id="@+id/persondetails_title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="right"
                android:paddingTop="3dp"
                android:text=" Title "
                android:layout_alignParentRight="true" />

            <TextView
                android:id="@+id/persondetails_name"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text=" Name "
                android:textSize="@dimen/font_big"
                android:textStyle="bold" 
                android:layout_toEndOf="@id/persondetails_title"
                android:layout_toRightOf="@id/persondetails_title" />

            <TextView
                android:id="@+id/persondetails_surname"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_toEndOf="@id/persondetails_name"
                android:layout_toRightOf="@id/persondetails_name"
                android:text=" Surname " />

        </RelativeLayout>

现在,只要这三个Textviews在屏幕上填写一行就可以了,但是只要其中一行变大,我就会遇到一些问题。例如,当我将surname字段设置得很长时,它会将其他2个视图推出屏幕(它们不可见)并占用所有空间(但只有一行!)。

我想要的是这些视图与右侧对齐,每个视图都在前一个视图的右侧,当需要换行到一个新行(不管是哪个文本视图)时新行以下文本视图应与其右侧对齐。

那么我需要在代码中进行哪些更改,以便这些Textview彼此相邻排列,并在其中一个变大时正确移动?

谢谢

这是我实施Elltz建议的方式:

     <LinearLayout
            android:id="@+id/persondetails_namen_horizontal_container"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="right"
            android:gravity="right"
            android:orientation="horizontal"
            android:weightSum="2" >

            <TextView
                android:id="@+id/persondetails_wert_titel"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="right" />

            <TextView
                android:id="@+id/persondetails_wert_vorname"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:layout_below="@id/persondetails_text_vorname"
                android:gravity="right"
                android:layout_gravity="right"
                android:text=" "
                android:ellipsize="marquee"
                android:marqueeRepeatLimit="marquee_forever"
                android:overScrollMode="always"
                android:scrollHorizontally="true"
                android:singleLine="true"/>

            <TextView
                android:id="@+id/persondetails_wert_nachname"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:layout_below="@id/persondetails_text_vorname"
                android:layout_gravity="right"
                android:text=" "
                android:ellipsize="marquee"
                android:marqueeRepeatLimit="marquee_forever"
                android:overScrollMode="always"
                android:scrollHorizontally="true"
                android:singleLine="true"/>
        </LinearLayout>

但仍然无法正常工作。实际上我删除了“singleLine = true”,因为如果3个文本视图中的一个太长,我需要它中断(没有破坏的问题)。

关于破解,我希望每个textview都可以作为所需的muche空间,唯一的是所有其他视图都应该正确移动。

属性“单行”不能正确,因为这些视图中的一个可能对于一行来说太长,但我已经用单行测试它而没有:

a)“singleline = true”enter image description here

b)没有“singleline = true”enter image description here

在某些情况下,我得到了错误的输出,但是案例2更接近我想要的。但是如果你看一下它就会看到textview2正在被推动并且它在它的范围内突破但不是在整个长度上。 Textview 3占用的空间最大。但我想要的是每个视图都完全拉伸,如果需要突破到新的行(textview1是这个“Mag。”)

这就是我希望它的样子:

enter image description here

3 个答案:

答案 0 :(得分:0)

将相对布局更改为线性布局,然后将方向设置为水平,如下所示。

        <LinearLayout:id="@+id/persondetails_names_horizontal_container"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal" />

        <TextView
            android:id="@+id/persondetails_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingTop="3dp"
            android:text=" Title "
            />

        <TextView
            android:id="@+id/persondetails_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text=" Name "
            android:textSize="@dimen/font_big"
            android:textStyle="bold" 
            />

        <TextView
            android:id="@+id/persondetails_surname"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text=" Surname " />

    </LinearLayout>

答案 1 :(得分:0)

您应该尝试执行LinearLayout并对每个元素进行加权。

        <LinearLayout
        android:id="@+id/persondetails_names_horizontal_container"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right"
        android:gravity="right" >

        <TextView
            android:id="@+id/persondetails_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="right"
            android:paddingTop="3dp"
            android:text=" Title "
            android:layout_weight= "1"
            android:layout_centerVertical="true"/>

        <TextView
            android:id="@+id/persondetails_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text=" Name "
            android:textSize="@dimen/font_big"
            android:textStyle="bold" 
            android:layout_weight= "1"
            android:layout_centerVertical="true"/>

        <TextView
            android:id="@+id/persondetails_surname"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight= "1"
            android:layout_centerVertical="true"
            android:text=" Surname " />

    </LinearLayout>

答案 2 :(得分:0)

要回答为什么您的代码行给您的问题是RelativeLayoutView相对于彼此定位,View需要另一个View如果不是父母本身就会被列出来。因此,TextView 1位于TextView 2的左侧,当TextView两个变大时,因为它向左,它将在左侧但不在屏幕布局或空间上获得它?

回答你

TextView 1将是最短的使用LinearLayout方法weightsumweight以这种方式进行调整首先将weightsum设置为LinearLayout {1}}和两个我将会很长 TextView给他们宽度0dp和权重1每个最短TextViewwrap_content作为width,这就是生命的全部。现在两个长的TextView将计算它们的大小,剩下的将留给较短的一个。我并不具体说明你希望你的TextView在直线水平线方面有多长,但在你完成之后你可以将这些元素添加到xml中的TextView或者你可以在java中执行确保你的直线TextView

android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:overScrollMode="always"
android:scrollHorizontally="true"
android:singleLine="true"

修改

这就是我的意思

int width = getWindow().getDecorView().getMeasuredWidth();
//i am getting the overal width of the screen
    Toast.makeText(getApplicationContext(), String.valueOf(width), Toast.LENGTH_SHORT).show();//toast it
    for(int i =0; i < ((LinearLayout)findViewById(R.id.l)).getChildCount(); i++){
        //looping through the parent container
        TextView child = (TextView) ((LinearLayout)findViewById(R.id.l)).getChildAt(i);
        child.setSelected(true);
        child.setEllipsize(TruncateAt.MARQUEE);
        child.setHorizontallyScrolling(true);
        child.setSingleLine(true);
        if(i+1 == 3){ //the last textview
            child.setLayoutParams(new LinearLayout.LayoutParams(
                    ((LinearLayout)findViewById(R.id.l)).getChildAt(1).getRight(), 
                    LinearLayout.LayoutParams.WRAP_CONTENT));
        }else{ // the first two take 1/3 of the width of the screen
            child.setLayoutParams(new LinearLayout.LayoutParams(width/3, LinearLayout.LayoutParams.WRAP_CONTENT));
        }
    }
}

希望有所帮助