【问题标题】:Android align multiple TextView-s in lineAndroid对齐多个TextView-s
【发布时间】:2015-05-17 18:34:58
【问题描述】:

我正在尝试将多个(可变)文本视图对齐在一行中。它应该是这样的:

- Textview1 | Textview2 | TextView3

由于文本视图的长度不同,我无法正确对齐它们(我唯一知道的是 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 个 Textview 在屏幕上填满一行,一切正常,但一旦其中一个变大,我就会遇到一些问题。例如,当我将 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 占用尽可能多的空间,唯一的事情是所有其他视图都应该正确移动。

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

a) 带有“singleline=true”

b) 没有“singleline=true”

在这两种情况下,我都得到了错误的输出,但情况 2 更接近我想要的。但是,如果您查看它,您会看到 textview2 正在被推送并且它超出了它的边界,但不是在整个长度上。 Textview 3 占用的空间最多。但我想要的是每个视图都被完全拉伸,如果需要的话可以换行(textview1 是这个“Mag”)

这就是我想要的样子:

【问题讨论】:

  • 抱歉我没看到。你在哪里发布你的答案?

标签: android android-layout textview alignment android-relativelayout


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您应该尝试做一个 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>
    

    【讨论】:

    • 如果您要设置权重,您需要在线性布局上放置权重总和 3,我说得对吗?
    • 实际上,在我使用相对布局之前,我使用了线性布局,这正是您所描述的方式。问题是每个文本视图都有自己的宽度(用“权重”属性描述),如果它太长,它不会进一步向右推,它会在它所占用的空间中创建一个新行。例如,如果 Textview2 太长,它不会将 textview3 进一步向右推,但会在自己的空间中换行(希望我这样描述是可以理解的)。
    • @andy Joyce,不,您不必将权重的总和设为 3。您放置的所有权重都被相加,屏幕水平/垂直除以该数字,然后每个观点都对他们的体重有所了解。例如,如果所有权重之和为 10,则屏幕宽度除以 then,如果一个视图的权重 os 为 2,它将得到屏幕宽度的 2/10
    【解决方案3】:

    要回答为什么您的代码行给您的问题是 RelativeLayout 将其 Views 相对于彼此定位,如果不是父级本身,View 将需要另一个 View 进行布局。所以TextView 1 位于TextView 2 的左侧,当TextView 2 变大时,它会在左侧,但不会在屏幕布局或空间上得到它?

    回答你

    TextView 1 将是最短的 使用LinearLayout 方法与weightsum 和weight 以这种方式调整它首先将weightsum 设置为两个LinearLayout 和两个我是会很长TextViews 给它们一个宽度0dp 和重量1 每个最短的TextView 将有wrap_content 作为width,这就是生活的美好。现在两个长的TextViews 将计算它们的大小,其余的将留给较短的一个。我并没有具体说明您希望您的TextView 在水平直线方面如何变长,但是在您完成之后,您可以在 xml 中将这些元素添加到您的TextView,或者您可以在 java 中执行此操作以确保您的直线TextViews

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

    希望对你有帮助

    【讨论】:

    • 嗨,Elitz,为了便于阅读,我已经用“新答案”回答了你
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 2021-05-01
    • 2014-02-18
    • 1970-01-01
    • 2017-07-05
    相关资源
    最近更新 更多