屏幕上始终有两个TextView

时间:2017-01-10 06:37:38

标签: android android-layout

我正在尝试并排放置两个TextView,以便两者始终在屏幕上。

他们应该始终保持彼此相邻,触摸边界。但是文本会动态变化,所以即使第一台电视中的文字太长,也不应该将第二台电视机推出屏幕。

这是基本布局:

<?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="wrap_content"
    android:layout_margin="10dp"
    android:orientation="horizontal">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:background="@color/colorAccent"
        android:padding="10dp"
        android:text="Aa" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:background="@color/colorPrimary"
        android:padding="10dp"
        android:text="Bb" />

</LinearLayout>

这就是它的样子:

Basic Layout

但是,如果文本变长,则第二个TextView会被推离屏幕。

Second TV pushed off screen

我甚至尝试使用RelativeLayout做同样的事情。

<?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="wrap_content"
    android:layout_margin="10dp">

    <TextView
        android:id="@+id/a"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@color/colorAccent"
        android:padding="10dp"
        android:text="Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/a"
        android:background="@color/colorPrimary"
        android:padding="10dp"
        android:text="Bb" />

</RelativeLayout>

仍然是同样的问题,第二个TextView不会停留在屏幕上。我想要第一个textView进行椭圆化,或者转换成两行而不将第二个TextView从屏幕上推下来。但我也不希望第二个TextView卡在屏幕右侧(这可以通过给第一个TextView的权重为1来完成)

PS:对我来说,视图的背景并不重要,所以即使我可以通过将视图锁定在屏幕的右侧来管理它,它也完全没问题。 为此,我尝试在 LinearLayout 中的两个视图上使用权重,并在 RelativeLayout 中使用 layout_alignParentRight - 但没有任何成功。

编辑:

如果我在两种布局上使用权重 - 这就是它的样子:

<?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="wrap_content"
    android:layout_margin="10dp"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/a"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:background="@color/colorAccent"
        android:padding="10dp"
        android:layout_weight="1"
        android:text="Aaa" />

    <TextView
        android:id="@+id/b"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:background="@color/colorPrimary"
        android:padding="10dp"
        android:text="Bbfbd" />

</LinearLayout>

Weights on both Views

如果文本很长,这很好,但是文字很短,就会失败。

使用长文本可以完美运行。 Weight with long text

解决方案:

我能想到的唯一解决方案是为第一个TextView定义maxWidth属性。此属性在dimens.xml中定义,具有不同屏幕大小的不同值。

  

main.xml中

<?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="wrap_content"
    android:orientation="horizontal"
    android:padding="10dp">

    <TextView
        android:id="@+id/a"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@color/colorAccent"
        android:ellipsize="end"
        android:maxLines="1"
        android:maxWidth="@dimen/max_text_view_width"
        android:padding="10dp"
        android:text="Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" />

    <TextView
        android:id="@+id/b"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@color/colorPrimary"
        android:padding="10dp"
        android:maxLines="1"
        android:text="Bbbbbbb" />

</LinearLayout>
  

dimens.xml

<resources>
    <dimen name="max_text_view_width">300dp</dimen>
</resources>

此输出如下所示: Output with maxWidth

8 个答案:

答案 0 :(得分:3)

  

TextView的属性为maxWidth。你可以设置它   编程

Display display = getWindowManager().getDefaultDisplay();
        Point size = new Point();
        display.getSize(size);
        int width = size.x;  //width of the screen
        int height = size.y; // height of the screen
        textView1.setMaxWidth(width/2);
        textView2.setMaxWidth(width/2); //disable this if you want to have the rest of the screen by second textView
  

现在,textView最初将具有最小尺寸并将增长到   屏幕的一半大小的最大值。你可以自定义这个   有条件满足你的需求。

enter image description here enter image description here

答案 1 :(得分:0)

如果textviews是静态的,可以将它们保留在LinearLayout中,并为每个文本视图分配权重= 1。这样他们总会保持不变。

要获得更好,更灵活的解决方案,请使用Google的flexbox layout。这是一个很棒的图书馆,你可以做各种各样的事情。

答案 2 :(得分:0)

enter image description here这肯定有效:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="10dp"
    android:orientation="horizontal">

    <TextView
        android:layout_weight="1"
        android:id="@+id/a"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@color/colorAccent"
        android:padding="10dp"
        android:text="Asssda" />

    <TextView
        android:layout_weight="1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/a"
        android:background="@color/colorPrimary"
        android:padding="10dp"
        android:text="Bxdadsdc" />

</LinearLayout>

答案 3 :(得分:0)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:layout_margin="10dp">

    <TextView
        android:id="@+id/a"
        android:layout_width="0dp"
        android:layout_weight=".5"
        android:layout_height="wrap_content"
        android:background="@color/colorAccent"
        android:padding="10dp"
        android:text="wqkdnoqwndowqndowqowndowqndodnwqodnqow" />

    <TextView
        android:layout_width="0dp"
        android:layout_weight=".5"
        android:layout_height="match_parent"
        android:background="@color/colorPrimary"
        android:padding="10dp"
        android:text="Aaaaaaaaainqwdiwdiwdniwqndiwqiwndiwqndiwqdniqwnnwiqdwoqndqowqndolnqwdlnaa\nkpaaaa" />

</LinearLayout>

它不是exaclty解决方案,但你应该使用这种在线性布局中使用权重的方法。

答案 4 :(得分:0)

输入以下代码,问题将解决:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:weightSum="2"
    android:orientation="horizontal"
    android:layout_margin="10dp">

    <TextView
        android:id="@+id/a"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:background="@color/colorAccent"
        android:padding="10dp"
        android:scrollbars="vertical"
        android:maxLines="2000"
        android:text="Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" />

    <TextView
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/a"
        android:background="@color/colorPrimary"
        android:padding="10dp"
        android:scrollbars="vertical"
        android:layout_alignParentRight="true"
        android:text="Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" />

</LinearLayout>

答案 5 :(得分:0)

可行的是为第一个视图设置maxWidth。您可以使用xml资源为多种屏幕尺寸设置maxWidth。

android:maxWidth="@dimen/max_width"

然后你可以在dimens.xml中设置max_width

答案 6 :(得分:0)

给予每个视图相同的权重会使它们占据屏幕的一半。我想这不是你要找的东西。

我认为这里最好的选择是以编程方式计算设备的屏幕宽度,并将第一个textView的最大宽度设置为屏幕宽度的百分比。

答案 7 :(得分:0)

最终对我有用的是为第一个视图设置maxWidth。

我在dimens xml中设置了maxWidth,并覆盖了多个屏幕尺寸的值。很难在多个屏幕上进行测试,但这最终对我有用。

android:maxWidth="@dimen/max_width"