Android LinearLayout父级有3个孩子,1个有一个重量,另一个有固定宽度和最后一个动态

时间:2013-12-11 23:41:07

标签: android android-layout android-linearlayout

我的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。

2 个答案:

答案 0 :(得分: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>

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

答案 1 :(得分:0)

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

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

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