Android: 相对于其他视图元素动态设置 TextView 宽度

Android: set TextView width dynamically in relation to other view elements

我得到了这个 TextView basket_item_list_optionsTextView 的文本是动态设置的,可以很长。

问题是,如果它很长,这个TextView右边的三个Button就会被挤出视野。我想设置此 TextView 的宽度,使 Button 仍在视图中,它只是为自己使用更多行(使用更多高度)。

有谁知道我需要更改什么才能做到这一点?或者我需要以编程方式执行此操作吗?

当 TextView 内容不是太多时,它是这样的:

字符串 "Nichts: Stuff;" 是 TextView 的内容。如果这个内容太多,右边的三个buttons会被挤出视野。

布局代码如下:

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/item_list_item"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:padding="5dp">

    <LinearLayout
        android:id="@+id/basket_item_list_description"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toEndOf="@+id/basket_item_list_image"
        android:layout_toRightOf="@+id/basket_item_list_image"
        android:orientation="vertical">

        <TextView
            android:id="@+id/basket_item_list_itemname"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerVertical="false"
            android:layout_marginLeft="10dp"
            android:layout_marginStart="10dp"
            android:layout_toEndOf="@+id/basket_item_list_image"
            android:layout_toRightOf="@+id/basket_item_list_image"
            android:text="ItemName"
            android:textColor="@android:color/black"
            android:textSize="24sp"
            tools:layout_editor_absoluteX="158dp"
            tools:layout_editor_absoluteY="37dp" />

        <TextView
            android:id="@+id/basket_item_list_options"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:layout_marginStart="10dp"
            android:text="Options" />
    </LinearLayout>

    <Button
        android:id="@+id/basket_item_list_increment"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toEndOf="@+id/basket_item_list_description"
        android:layout_toRightOf="@+id/basket_item_list_description"
        android:minWidth="1dp"
        android:text="+" />

    <Button
        android:id="@+id/basket_item_list_decrement"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"
        android:layout_marginStart="5dp"
        android:layout_toEndOf="@+id/basket_item_list_increment"
        android:layout_toRightOf="@+id/basket_item_list_increment"
        android:minWidth="1dp"
        android:text="-" />

    <ImageButton
        android:id="@+id/basket_item_list_delete"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"
        android:layout_marginStart="5dp"
        android:layout_toEndOf="@+id/basket_item_list_decrement"
        android:layout_toRightOf="@+id/basket_item_list_decrement"
        android:text="-"
        app:srcCompat="@drawable/ic_garbage" />

    <ImageView
        android:id="@+id/basket_item_list_image"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_alignParentLeft="false"
        android:layout_alignParentStart="false"
        android:layout_alignParentTop="false"
        android:layout_alignWithParentIfMissing="false"
        android:layout_centerHorizontal="false"
        app:srcCompat="@drawable/shop_sample" />

    <TextView
        android:id="@+id/basket_item_list_price"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:layout_marginEnd="10dp"
        android:layout_marginRight="10dp"
        android:gravity="center_vertical"
        android:text="1€"
        android:textColor="@android:color/black"
        android:textSize="14sp"
        tools:layout_editor_absoluteX="158dp"
        tools:layout_editor_absoluteY="37dp" />

    <TextView
        android:id="@+id/basket_item_list_count"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="false"
        android:layout_alignParentRight="false"
        android:layout_centerVertical="true"
        android:layout_marginEnd="2dp"
        android:layout_marginRight="2dp"
        android:layout_toLeftOf="@+id/basket_item_list_price"
        android:layout_toStartOf="@+id/basket_item_list_price"
        android:gravity="center_vertical"
        android:text="nx"
        android:textColor="@android:color/black"
        android:textSize="14sp"
        android:visibility="gone"
        tools:layout_editor_absoluteX="158dp"
        tools:layout_editor_absoluteY="37dp" />

</RelativeLayout>

您可以使用 LinearLayoutweightSum 属性在视图之间平均分配可用的 space。请参考下面的示例代码,ragards.

我已经把 weightSum=10 放在哪个变量中,你可以根据你的要求把它分配给子视图,这将占用 space wrt to weightSum percentage

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="10"
android:padding="5dp">
   <TextView 
     android:layout_weight="7"
     android:layout_width="0dp"
     android:text="some text"
     android:layout_height="wrap_content"/>

  <Button
     android:text="btn1"
     android:layout_weight="1"
     android:layout_width="0dp"
     android:layout_height="wrap_content"/>
  <Button
     android:text="btn2"
     android:layout_weight="1"
     android:layout_width="0dp"
     android:layout_height="wrap_content"/>
  <Button
     android:text="btn3"
     android:layout_weight="1"
     android:layout_width="0dp"
     android:layout_height="wrap_content"/>

</RelativeLayout>

这样做肯定对你有帮助:-

<LinearLayout
        android:id="@+id/basket_item_list_description"
        android:layout_width="150dp"
        android:layout_height="wrap_content"
        android:layout_toEndOf="@+id/basket_item_list_image"
        android:layout_toRightOf="@+id/basket_item_list_image"
        android:orientation="vertical">

        <TextView
            android:id="@+id/basket_item_list_itemname"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerVertical="false"
            android:layout_marginLeft="10dp"
            android:layout_marginStart="10dp"
            android:layout_toEndOf="@+id/basket_item_list_image"
            android:layout_toRightOf="@+id/basket_item_list_image"
            android:text="ItemName"
            android:textColor="@android:color/black"
            android:textSize="24sp"
            tools:layout_editor_absoluteX="158dp"
            tools:layout_editor_absoluteY="37dp" />

        <TextView
            android:id="@+id/basket_item_list_options"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:layout_marginStart="10dp"
            android:text="Options"
           />
    </LinearLayout>

使用 weightSum 概念以获得更好的结果。首先把它做成两个独立的布局,一个用于描述,另一个用于三个按钮。现在将具有这两个布局的一个父布局作为具有各自布局权重的子布局。父布局应该是两个子个体权重的总和。

供参考:https://www.linkedin.com/pulse/android-layout-weight-weightsum-ramasamy-kasiviswanathan/

我建议您在 Views 上使用 weight 参数。然后你的行元素将固定大小,而不是你应该在 TextView 上使用水平滚动。 使用 weight 的示例:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:weightSum="1">

        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="0.5"
            android:scrollHorizontally="true"
            android:maxLines="1"/>

        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="0.5"
            android:scrollHorizontally="true"
            android:maxLines="1"/>
    </LinearLayout>
</LinearLayout>  

您应该在应该是一些对象(f.e。按钮、图像... 的行中插入另一个 LinearLayoutandroid:scrollHorizontally="true"android:scrollHorizontally="true" TextView 参数表示文本将仅以固定大小显示 TextView,如果文本很长,则不会覆盖其他视图。
注意父布局宽度不能是 wrap_content.

尝试使用以下代码,这里我说的是 LinearLayout 作为父级,其中所有布局都是 LinearLayout。您可以根据需要更改 weight

结构:

<LinearLayout>
    <LinearLayout> //weight 
          <ImageView>
          <TextView>
    </LinearLayout> 

   <LinearLayout>//weight 
          //all Buttons
   </LinearLayout> 

<LinearLayout>

完整代码如下:

    <?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/item_list_item"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:padding="5dp">


    <LinearLayout
        android:layout_weight="1"
        android:id="@+id/basket_item_list_description"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

            <ImageView
                android:id="@+id/basket_item_list_image"
                android:layout_width="50dp"
                android:layout_height="50dp"
                app:srcCompat="@mipmap/ic_launcher" />



        </LinearLayout>
        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">


            <TextView
                android:id="@+id/basket_item_list_itemname"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_centerVertical="false"
                android:layout_marginLeft="10dp"
                android:layout_marginStart="10dp"
                android:layout_toEndOf="@+id/basket_item_list_image"
                android:layout_toRightOf="@+id/basket_item_list_image"
                android:text="Item"
                android:textColor="@android:color/black"
                android:textSize="24sp"
                tools:layout_editor_absoluteX="158dp"
                tools:layout_editor_absoluteY="37dp" />

            <TextView
                android:id="@+id/basket_item_list_options"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="10dp"
                android:layout_marginStart="10dp"
                android:text="Options" />


        </LinearLayout>


    </LinearLayout>


    <LinearLayout
        android:gravity="right"
        android:layout_weight="1.2"
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">



        <Button
            android:id="@+id/basket_item_list_increment"
            android:layout_width="35dp"
            android:layout_height="35dp"
            android:minWidth="1dp"
            android:text="+" />

        <Button
            android:id="@+id/basket_item_list_decrement"
            android:layout_width="35dp"
            android:layout_height="35dp"
            android:layout_marginLeft="5dp"
            android:layout_marginStart="5dp"
            android:text="-" />

        <ImageButton
            android:id="@+id/basket_item_list_delete"
            android:layout_width="35dp"
            android:layout_height="35dp"
            android:layout_marginLeft="5dp"
            android:layout_marginStart="5dp"
            android:text="-"
            app:srcCompat="@mipmap/ic_launcher" />





        <TextView
            android:id="@+id/basket_item_list_price"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginEnd="10dp"
            android:layout_marginRight="10dp"
            android:gravity="center_vertical"
            android:text="1€"
            android:textColor="@android:color/black"
            android:textSize="14sp"
            tools:layout_editor_absoluteX="158dp"
            tools:layout_editor_absoluteY="37dp" />

        <TextView
            android:id="@+id/basket_item_list_count"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginEnd="2dp"
            android:layout_marginRight="2dp"
            android:gravity="center_vertical"
            android:text="nx"
            android:textColor="@android:color/black"
            android:textSize="14sp"
            android:visibility="visible"
            tools:layout_editor_absoluteX="158dp"
            tools:layout_editor_absoluteY="37dp" />

    </LinearLayout>

</LinearLayout>