【问题标题】:How to avoid nested weights?如何避免嵌套权重?
【发布时间】:2012-10-05 09:55:58
【问题描述】:

我有一个输入密码的 xml 布局:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#FF000000"
    android:orientation="vertical"
    android:weightSum="1" >

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="0dp"
    android:layout_margin="5dp"
    android:layout_weight="0.2"
    android:background="@android:drawable/edit_text"
    android:gravity="center_vertical"
    android:orientation="horizontal" >

    <EditText
        android:id="@+id/pinDisplay"
        android:layout_width="0dip"
        android:layout_height="fill_parent"
        android:layout_weight="0.85"
        android:background="@null" />

    <ImageButton
        android:id="@+id/backspace"
        style="@android:style/Widget.Button"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:layout_gravity="center_vertical"
        android:layout_margin="3dp"
        android:layout_weight="0.15"
        android:gravity="center"
        android:src="@android:drawable/ic_input_delete" />
</LinearLayout>

<!-- Keypad section -->

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="0dp"
    android:layout_weight="0.8"
    android:baselineAligned="false"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_marginLeft="5dip"
        android:layout_marginRight="4dip"
        android:layout_weight="1"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/one"
            android:layout_width="0sp"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:text="1"
            android:textAppearance="@android:attr/text" />

        <Button
            android:id="@+id/two"
            android:layout_width="0sp"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:text="2" />

        <Button
            android:id="@+id/three"
            android:layout_width="0sp"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:text="3" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="0sp"
        android:layout_marginLeft="5dip"
        android:layout_marginRight="4dip"
        android:layout_weight="1"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/four"
            android:layout_width="0sp"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:text="4" />

        <Button
            android:id="@+id/five"
            android:layout_width="0sp"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:text="5" />

        <Button
            android:id="@+id/six"
            android:layout_width="0sp"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:text="6" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="0sp"
        android:layout_marginLeft="5dip"
        android:layout_marginRight="4dip"
        android:layout_weight="1"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/seven"
            android:layout_width="0sp"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:text="7" />

        <Button
            android:id="@+id/eight"
            android:layout_width="0sp"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:text="8" />

        <Button
            android:id="@+id/nine"
            android:layout_width="0sp"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:text="9" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="0sp"
        android:layout_marginBottom="10dip"
        android:layout_marginLeft="5dip"
        android:layout_marginRight="4dip"
        android:layout_weight="1"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/ok"
            android:layout_width="0sp"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:enabled="false"
            android:text="OK"
            android:textColor="#B8B8B8" />

        <Button
            android:id="@+id/zero"
            android:layout_width="0sp"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:text="0" />

        <Button
            android:id="@+id/clear"
            android:layout_width="0sp"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:text="Clear" />
    </LinearLayout>
  </LinearLayout>
</LinearLayout>

布局很好,但我收到很多关于嵌套权重的 Lint 警告。

嵌套权重不利于性能

我并没有真正注意到布局加载缓慢或任何东西。我能做些什么来避免嵌套权重?还是我应该保持原样?

【问题讨论】:

    标签: android android-layout


    【解决方案1】:

    您可以使用 RelativeLayout 来避免嵌套权重。

    嵌套权重不利于性能,因为每嵌套一次,度量值的数量就会呈指数增长。

    【讨论】:

      【解决方案2】:

      一般来说,您应该尝试使用RelativeLayout,而不是嵌套许多LinearLayouts。

      来自documentation

      注意:虽然您可以在另一个布局中嵌套一个或多个布局 为了实现你的 UI 设计,你应该努力保持你的布局 层次尽可能浅。如果有,您的布局会绘制得更快 更少的嵌套布局(宽视图层次结构优于深视图 层次结构)。

      但是当你需要权重时,比如现在,RelativeLayout 对你没有多大帮助;相反,我建议为您的键盘使用TableLayout,以减少嵌套布局的数量。

      【讨论】:

        猜你喜欢
        • 2013-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-05
        • 2020-04-01
        • 2020-05-22
        相关资源
        最近更新 更多