2016-09-23 69 views
-1

这是我第一次尝试Android应用程序。请原谅所有的无知和愚蠢。“重量”如何使元素填充Android布局中的可用空间?

我知道weight是如何为所有元素指定一个属性值。那么weight如何在LinearLayout中填充ListView中两个元素之间的所有可用空间时,它是唯一具有权重的元素?

我有一个简单的布局与ListView在顶部,并在屏幕的底部,一个EditText,“按钮, and的TextView . Only the的ListView and的TextView have weight`属性(许多属性像侧边缘等,并与元件略去了只有默认的属性):

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:layout_centerHorizontal="true" 
       android:orientation="vertical" 
       android:weightSum="10"> 

    <ListView 
      android:id="@+id/files_list" 
      android:background="@drawable/text_view_border" 
      android:layout_height="0dp" 
      android:layout_weight="7.99" 
      ... 
      android:soundEffectsEnabled="true" /> 

    <TextView 
      android:id="@+id/result_text" 
      ... 
      android:layout_width="fill_parent" 
      android:layout_marginLeft="20dp" 
      android:layout_marginRight="20dp" 
      android:layout_height="wrap_content" 
      android:layout_weight="0.43" 
      android:gravity="center" /> 
</LinearLayout> 

现在如何不会使ListView填补卵石的可用空间?我会认为height=*或类似的东西会这样做。 “0.43”+“7.99”不是很接近weightsome="10",这只会增加我的困惑。

+0

詹姆斯的回答应该很好地工作。究竟是如何/为什么它的工作我不再问自己,只是接受Android框架有时很奇怪。在LinearLayout案例中,我知道在使用“0dp”或“wrap_content”时,有一些奇怪的重量值倒置。作为一般规则,我已经使用0dp或wrap_content中的任何一个而不加权重,因为这些导致混淆了weirdnessess。 – Budius

回答

0

使用android:layout_width =“match_parent”insid fill_parent。这将填充宽度的屏幕的所有空间。 在android的最后一个版本中,fill_parent不再使用

+0

我不想填满屏幕宽度。我有'android:orientation =“vertical”',并且在屏幕底部有元素,我希望'ListView'填充屏幕顶部和顶部底部元素之间的空间。 – ProfK

3

在这种情况下,您不需要使用weightSumweightSum更有用,如果你想要一个视图只占用一部分可用空间而不是全部。如果您从result_text中删除重量并从LinearLayout中删除weightSum,那么它将按预期工作。您还可以将layout_weightfiles_list设置为更好的数字,如1

Documenation

定义最大重量总和。如果未指定,则总和由 加上所有孩子的layout_weight来计算。这可以用于 实例,通过 为单个孩子提供50%的总可用空间,使其layout_weight为0.5,并将weightSum设置为1.0。

必须是浮点值,如“1.2”。

这应做到:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:layout_centerHorizontal="true" 
       android:orientation="vertical"> 

    <ListView 
      android:id="@+id/files_list" 
      android:background="@drawable/text_view_border" 
      android:layout_height="0dp" 
      android:layout_weight="1" 
      ... 
      android:soundEffectsEnabled="true" /> 

    <TextView 
      android:id="@+id/result_text" 
      ... 
      android:layout_width="fill_parent" 
      android:layout_marginLeft="20dp" 
      android:layout_marginRight="20dp" 
      android:layout_height="wrap_content" 
      android:gravity="center" /> 
</LinearLayout> 
+0

谢谢你,我会试试你的例子,但是这个问题背后的原因是“为什么'weight'要做到这一点”,而不是“权重”有什么替代方案,在语义上它有点令人困惑。 – ProfK

+0

答案是这不是重量的目的。你希望'ListView'占用所有可用空间,所以不需要重量。这不是重量的替代选择;重量是错误的解决方案。 –

+0

我的应用程序错误的解决方案是在Nexus模拟器和我的手机上工作。我在这里复制了重量示例表单的答案,突然我的应用程序工作。是什么让LisrView获得所有剩余的空间呢?仅仅因为它有溢出并且不能覆盖其他控件,所以如果它只有1个元素,它不会填满所有空间? – ProfK

相关问题