使用LinearLayout和layout的奇怪行为:weight

时间:2017-01-15 03:45:00

标签: android android-layout

我正在读一本关于Android的书,我被困在这里

以下是说明:

  1. 使用我们最近创建的Real UI项目,但让我们完全开始 布局干净的床单。右键单击项目中的布局文件夹 探险家。从弹出的上下文相关选项菜单中,选择New | 布局资源文件。
  2. 确保为Root元素选择了LinearLayout。
  3. 将文件命名为list_detail_layout,然后左键单击“确定”。
  4. 在“属性”窗口中,找到的方向属性 LinearLayout,默认情况下提供,并将其更改为水平。
  5. 将LinearLayout(垂直)拖到设计上。
  6. 现在将LinearLayout(水平)拖到设计
  7. 选择根LinearLayout中的第一个(垂直)LinearLayout,find 它的布局:重量属性,并将其设置为40.将其背景设置为颜色 您可以通过查找并左键单击背景属性省略...来选择... 然后左键单击“颜色”选项卡并选择一种颜色。
  8. 选择根LinearLayout中的第二个(水平)LinearLayout, 找到它的布局:重量属性,并将其设置为60.我们现在有两个 屏幕清晰可辨的区域:一个占40%,另外60%, 如下图所示:
  9. Screen Shot enter image description here 我遵循所有步骤,但我仍然没有得到图像的结果。这是我的XML代码:

    <?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"
        android:orientation="horizontal" android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="40"
            android:background="@android:color/holo_orange_light"></LinearLayout>
        <LinearLayout
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="60"></LinearLayout>
    </LinearLayout>
    

    如果我将layout_width值更改为&#34; wrap_content&#34;它有效,但我不知道书中没有提到为什么......

3 个答案:

答案 0 :(得分:0)

您必须在父级中使用weightSum

应该看起来像

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

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_weight="40"
        android:background="@android:color/holo_orange_light"></LinearLayout>
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_weight="60"></LinearLayout>
</LinearLayout>

答案 1 :(得分:0)

android:layout_weight属性告诉LinearLayout如何分发其子级。如果您为两个窗口小部件赋予相同的值,但这并不一定使它们在屏幕上具有相同的宽度。要确定其子视图的宽度,LinearLayout使用layout_widthlayout_weight参数的混合。

LinearLayout进行两次传递以设置视图的宽度。在第一轮中,LinearLayout会查看layout_width(或layout_height,以获取垂直方向)。如果两个LinearLayout的layout_width值均为wrap_content,那么每个视图将只有足够的空间来绘制自己。

<?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"
          android:orientation="horizontal"
android:layout_width="match_parent"
          android:layout_height="match_parent">

<LinearLayout
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_weight="40"
    android:background="@android:color/holo_orange_light"></LinearLayout>
<LinearLayout
    android:orientation="horizontal"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_weight="60"></LinearLayout>
</LinearLayout>

我猜你是初学者。我想提一下,编写自己的UI设计代码比拖放更好。

答案 2 :(得分:0)

当您使用 android:layout_weight 时,请确保您在父LinearLayout中设置 android:weightSum 或设置 android:layout_width = 0

<?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"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="40"
        android:background="@android:color/holo_orange_light"> 
    </LinearLayout>
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="60">
   </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"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:weightSum="100">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_weight="40"
        android:background="@android:color/holo_orange_light"></LinearLayout>
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_weight="60"></LinearLayout>
</LinearLayout>