【问题标题】:Android LinearLayout parent with 3 children, 1 with a weight, another with a fixed width and the last dynamicAndroid LinearLayout 父级有 3 个子级,1 个有权重,另一个有固定宽度,最后一个是动态的
【发布时间】:2013-12-11 23:41:07
【问题描述】:

我的 android 应用程序中有一个表单,它由一个垂直方向的父 LinearLayout 和一堆水平方向的子元素组成。孩子们有一个标签 (TextView),然后是一个 EditText。包装每个表单行的 LinearLayout 设置为具有 match_parent 的宽度,因此它填充了屏幕的宽度。包含标签和编辑文本的内部表单行布局大小为 30% 标签,70% 文本字段。我有一个字段,虽然它有一个标签(textview),编辑文本,然后在同一行上有另一个文本视图。我希望标签保留 30% 的空间,固定该行末尾的最后一个文本视图,并使用 edittext 占用剩余空间。这是代码示例:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >
    <LinearLayout style="@style/FormRow">
        <TextView 
           android:id="@+id/Username"          
           style="@style/FormRowLabel"
           android:text="@string/username_hint"
    />
    <EditText  
        android:id="@+id/UsernameValue"         
        style="@style/FormRowEditText"
                android:inputType="textEmailAddress"
                    />
</LinearLayout>
.....

<LinearLayout style="@style/FormRow">
        <TextView 
           android:id="@+id/AnotherField"          
               style="@style/FormRowLabel"
               android:text="@string/fieldname"
            />
    <EditText  
        android:id="@+id/AnotherFieldValue"         
        style="@style/FormRowEditText"
        android:width="?"
                    />

         <TextView layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="sometext"
            />
      </LinearLayout>                   

</LinearLayout>

我的风格是这样的:

  <style name="FormRow">
        <item name="android:layout_width">match_parent</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:orientation">horizontal</item>
        <item name="android:paddingTop">6dp</item>
        <item name="android:paddingBottom">6dp</item>
        <item name="android:paddingLeft">6dp</item>
        <item name="android:paddingRight">6dp</item>
        <item name="android:weightSum">10</item>
    </style>
    <style name="FormRowLabel">
        <item name="android:layout_height">wrap_content</item>
        <item name="android:layout_width">0dp</item>
        <item name="android:layout_marginLeft">2dp</item>
        <item name="android:layout_weight">3</item>
        <item name="android:singleLine">false</item>
        <item name="android:layout_gravity">center_vertical</item>
    </style>

    <style name="FormRowEditText" parent="EditText">
        <item name="android:layout_width">0dp</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:layout_weight">7</item>
    </style>  

我已经尝试过为所有 3 个使用权重,但在横向上,我最终会为可用于编辑文本的文本视图留出一大堆空间。有没有办法用布局权重来做到这一点?或者我还能怎么做?我不是相对布局的忠实粉丝,所以我更愿意将这些内部布局保留为 LinearLayouts。

【问题讨论】:

标签: android android-layout android-linearlayout


【解决方案1】:

我了解您遇到的问题,为了实现您想要的,您必须改变构建它的方式。

让我们创建两列,而不是行。第一列将包含所有标签,第二列将包含 EditText 视图,以及偶尔的 EditText + TextView

示例:

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

    <LinearLayout
        android:layout_width="0dp"
        android:layout_weight="3"
        android:orientation="vertical" >

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

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

    <LinearLayout
        android:layout_width="0dp"
        android:layout_weight="7"
        android:orientation="vertical" >

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

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

            <EditText
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1" />

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

</LinearLayout>

如果您有任何问题,请告诉我!

【讨论】:

  • 嗯,有趣的解决方案。制作 2 个垂直列的问题是左右列中的东西垂直对齐。我认为表格布局可能是最好的方法。
  • 不一定。使用重力,您可以实现所需的任何目标。
  • 我很困惑,如果内部元素的高度不同,高度设置为包装内容的元素将如何排列在 2 个单独的视图中?我左边的一些标签是 2 行,具体取决于语言,它现在工作正常,但我看不到它们将如何工作,特别是如果我不知道提前哪些会换行,以便我可以在对应元素的右列。我必须使用固定高度的行,我认为这样才能工作,我不想那样做。
  • 我明白了,你是对的。这可能非常麻烦。表格可能更适合您正在做的事情。祝你好运:)
【解决方案2】:

是的,有可能。我是这样做的:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="30dp"
    android:id="@+id/abcd"
    android:clickable="true"
    android:elevation="10dp"
    android:focusable="false"
    android:background="@drawable/selection_on_higlight"
    >

    <TextView
        android:id="@+id/efg"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Name"
        android:textSize="15sp"
        android:layout_alignParentTop="true"
        android:textAppearance="?attr/textAppearanceListItem"
        android:layout_weight="0.8"
        android:layout_gravity="center"
        android:nestedScrollingEnabled="true"
        android:singleLine="false"
        android:ellipsize="none"
        android:selectAllOnFocus="true" />

    <TextView
        android:id="@+id/hij"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textAppearance="?attr/textAppearanceListItem"
        android:text="x 99"
        android:layout_toEndOf="@+id/cartItemName"
        android:textSize="15sp"
        android:layout_alignParentTop="true"
        android:layout_weight="1.2"
        android:layout_gravity="center"
        android:nestedScrollingEnabled="true" />

    <ImageView
        android:layout_width="fill_parent"
        android:layout_height="25dp"
        android:layout_alignParentTop="true"
        android:id="@+id/lmn"
        android:layout_toLeftOf="@+id/cartItemSubtotal"
        android:src="@drawable/broccoli"
        android:layout_toEndOf="@+id/cartItemQty"
        android:layout_weight="1"
        android:layout_gravity="center_vertical"
        android:nestedScrollingEnabled="false"
        android:adjustViewBounds="false" />

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/xyz"
        android:text="abcd"
        android:textSize="15sp"
        android:textAppearance="?attr/textAppearanceListItem"
        android:layout_alignParentTop="true"
        android:layout_alignParentEnd="true"
        android:gravity="center_vertical|center_horizontal|right"
        android:layout_gravity="center"
        android:nestedScrollingEnabled="false"
        android:layout_weight="1.1"
        android:textStyle="bold" />


</LinearLayout>

只需将宽度属性设置为匹配父级并相应地指定权重

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    • 2012-10-03
    相关资源
    最近更新 更多