我想在一行中对齐多个(变量)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”
b)没有“singleline = true”
在某些情况下,我得到了错误的输出,但是案例2更接近我想要的。但是如果你看一下它就会看到textview2正在被推动并且它在它的范围内突破但不是在整个长度上。 Textview 3占用的空间最大。但我想要的是每个视图都完全拉伸,如果需要突破到新的行(textview1是这个“Mag。”)
这就是我希望它的样子:
答案 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)
要回答为什么您的代码行给您的问题是RelativeLayout
将View
相对于彼此定位,View
需要另一个View
如果不是父母本身就会被列出来。因此,TextView
1位于TextView
2的左侧,当TextView
两个变大时,因为它向左,它将在左侧但不在屏幕布局或空间上获得它?
回答你
TextView
1将是最短的使用LinearLayout
方法weightsum
和weight
以这种方式进行调整首先将weightsum
设置为LinearLayout
{1}}和两个我将会很长 TextView
给他们宽度0dp
和权重1
每个最短TextView
将wrap_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));
}
}
}
希望有所帮助