2015-05-17 36 views
0

我想在一行中对齐多个(可变)textview。它应该是这样的:Android对齐多行TextView -s行

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

现在,只要这3个Textviews填写一行在屏幕上一切正常,但是只要一他们变得更大我有一些问题。例如,当我将surname字段放到很长的位置时,它会将其他两个视图从屏幕中移出(它们不可见),并占用所有空间(但只有一行!)。

我想要的是这些视图对齐到右侧,每个都在前一个的右侧,并且当需要将换行符换行到一个新行(无论哪个文本视图是这样)并且在新的一行以下文字浏览应该与它的权利保持一致。

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

谢谢

我这是怎么实现的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中的一个变得太长,我需要中断(不会有打破问题)。

关于破解,我希望每个文本视图都可以根据需要占用多少空间,唯一的问题是所有其他视图都应该正确移动。

属性“单行”不可能是正确的,因为它是可能的,其中一个视图变得很长一条线,但我已经使用单线和没有测试过它:

一)与“单线=真正的” enter image description here

b)无‘单线=真正的’enter image description here

在博特情况下,我得到一个错误的输出,但情况2更接近我想要的东西。但是,如果你看看它,你会看到textview2被推动,并且在它的范围内而不是在整个范围内。 Textview 3占用空间最大。但是,我想是每一个观点是完全streched,如果需要breaked到新行(textview1是这样的“弹匣”)

这是我怎么想它的样子:

enter image description here

+0

任何RESP onse?>> – Elltz

+0

抱歉,我没有看到它。你在哪里发布你的答案? – user3466562

回答

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

这是行不通的,已经回答了克里斯蒂威尔士 – user3466562

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

我是否正确地说,如果你正在设定重量,你需要在线性布局上加上3的权重总和? –

+0

实际上,在我使用相对布局之前,我使用了线性布局,您正在描述的确切方式。问题在于每个textview都有自己的宽度(用“weight”属性描述),并且如果它太长,它不会进一步向右移动,它将占用该空间中的新行。例如,如果Textview2太长,它不会将textview3进一步推向右侧,但它会在自己的空间中打破一条新线(希望我描述过这样可以理解)。 – user3466562

+0

@andy乔伊斯,不,你不必把权重的总和为3.所有你放的权重是总结和屏幕水平/垂直除以该数字,然后每个视图获得他们的部分关于他们的重量。例如,如果所有权重的总和为10,那么屏幕的宽度将被除以,如果一个视图的权重为os2,则将获得2/10的屏幕宽度 – user3466562

0

要回答为什么你的代码行是给你的问题是RelativeLayout位置的View小号彼此相对,一个View将需要另一个View到如果不是父母本身奠定了。所以TextView 1被定位在TextView 2的左边,当TextView两个变得更大时,它会向左移动而不会在屏幕布局或空间中获得它?

回答您

TextView 1将以最短使用LinearLayout引桥weightsumweight调整这种方式首先设置weightsum两对LinearLayout和两个我要去要长TextView s给他们的宽度为0dp和重量为1每个最短的TextView将有wrap_contentwidth这就是所有的生活是好的。现在两个长TextView s会计算它们的大小,剩下的将留给较短的一个。我没有具体说明你想要你的TextView长直线水平,但你已经完成后,你可以在xml中添加这些元素到你的TextView,或者你可以在java中做到这一点,以确保你的直线TextView s

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)); 
     } 
    } 
} 

希望它可以帮助

+0

Hi Elitz,对于为了可读性我已经用“新答案”回答了你, – user3466562