了解Android XML layout_weight的问题

我真的试过,但我不明白Android是如何解释layout_weight设置…

我试图达到的是

  • 顶部有一个固定高度的标题
  • 在底部的input区域包含一个EditText和一个button
  • 中间的内容部分正在占据空间的剩余部分

input时,我想将EditText增长到特定高度,并在input的文本超出可用高度时开始滚动。 这样做,我需要周围的LinearLayout与EditText一起增长。

如果我为内部的LinearLayout定义一个特定的高度,它将不会增长。 如果我不这样做,内部布局占用所有的空间,而不是ScrollView,无论我尝试使用layout_weight 。 🙁

我目前的XML如下所示:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="I'm a header" /> <ScrollView android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" android:gravity="bottom"> <LinearLayout android:id="@+id/itemContainer" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </ScrollView> <LinearLayout android:layout_width="fill_parent" android:layout_height="50dp" android:padding="2dp" android:gravity="bottom" android:isScrollContainer="true" android:background="@drawable/steel" > <EditText android:id="@+id/edittext01" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0.2" android:scrollbars="vertical" android:fadingEdge="vertical" android:fadingEdgeLength="60dp" android:maxHeight="40dp" android:textSize="15sp" /> <Button android:id="@+id/button" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0.8" android:layout_gravity="right" android:text="Send" android:textStyle="bold" android:textSize="15sp" /> </LinearLayout> </LinearLayout> 

任何提示,非常感谢!

Solutions Collecting From Web of "了解Android XML layout_weight的问题"

layout_weight用于确定在各种小部件获得所有他们想要的空间之后,Android如何分割剩下的空间。

所以说你连续有3个部件,每个部件都需要10个像素,但是你有50个像素的空间。 以下是layout_weights的几个示例以及每个小部件将声明的像素数量:

 widget1: weight = 1, 30px widget2: weight = 0, 10px widget3: weight = 0, 10px widget1: weight = 1, 20px widget2: weight = 1, 20px widget3: weight = 0, 10px widget1: weight = 1, 16.5px widget2: weight = 1, 16.5px widget3: weight = 1, 16.5px 

您可以将重量视为可用空间的百分比。 它会加起来所有的值,然后酌情给出部分。 因此,如果有帮助的话,可以使用加起来为100的权重做百分比:

 widget1: weight = 0, 10px widget2: weight = 25, 15px widget3: weight = 75, 25px 

如果我理解正确,您希望底部的小部件以特定大小开始,然后根据需要展开到某个最大大小,然后滚动。

而且,你想要它上面的部件接pipe所有额外的空间。

不幸的是,在Android中,它不可能指定最大尺寸。 我认为你可以做的最好的办法是给ScrollView一些固定的大小,layout_weight = 1,并告诉底部LinearLayout wrap_content。 这将(我认为)导致LinearLayout扩大,直到它不能再,因为ScrollView已经声称的空间。

然而,挑战是指定一个固定的大小为ScrollView在所有不同的屏幕尺寸和分辨率是有道理的。 您可能最终不得不为不同的分辨率创build不同的布局,这可能是不值得的。 就个人而言,我只是给editText一个固定的大小…

我有一个类似的问题(刷新时间戳粘贴到屏幕的底部和一个ListView /滚动视图占用所有的留空格),经过多次尝试使用以下布局为我工作:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_above="@+id/refresh_date_text" android:layout_alignParentTop="true" android:orientation="vertical" > <ListView android:id="@android:id/list" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#FFFFFF" android:layout_weight="1" android:divider="@drawable/list_divider" android:dividerHeight="1dp" android:drawSelectorOnTop="false" /> <TextView android:id="@android:id/empty" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ffffff" android:gravity="center_horizontal" android:paddingTop="10dp" android:text="The list is empty."/> </LinearLayout> <TextView android:id="@+id/refresh_date_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:gravity="center_horizontal" android:background="#f0f0f0" android:textStyle="italic" android:textSize="12dp" /> </RelativeLayout> 

当使用滚动条时,无法剪切ListView,在所有方向上完美alignment,正确显示“list is empty”文本。

我相信你用RelativeLayout会更好。 添加您的标题,并将其设置为layout_alignParentTop="true" 。 然后添加您的EditText和Button,将该区域设置为layout_alignParentBottom="true" 。 然后,添加中心区域,将宽度和高度设置为fill_parent ,并设置layout_above="{the id of the EditText/Button layout}"layout_below="{the id of the header layout}"

我没有在工作,否则我会为你testing,但应该工作。

 <LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:weightSum="1" > <TextView android:text=" TextView " android:textColor="#ffffff" android:textSize="15sp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#ff0000" /> <EditText android:text=" EditText " android:textSize="15sp" android:layout_width="250dp" android:layout_weight="1" android:layout_height="0dp" /> <Button android:text=" button " android:textColor="#000000" android:textSize="15sp" android:gravity="center_vertical|center_horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> 

这将有所帮助