嵌套权重Android布局

时间:2013-04-10 18:28:56

标签: android button android-layout-weight

我想要实现的是拥有一个TextView,它占据了大约70%的屏幕,其余的30%被分成两个按钮并排设置(水平)。我实现这一目标的唯一方法是使用下面的代码...但是xml编辑器抱怨嵌套的权利......尽管它有效但我知道这不是一个好的做法...我应该怎么做呢?

<LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<TextView android:id="@+id/news"
      android:textSize="14sp"
      android:textStyle="bold"
      android:textColor="#0033CC"
      android:layout_height="0px"
      android:layout_width="fill_parent"
      android:layout_weight="70"
      android:gravity="top"
/>

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="0px"
    android:orientation="horizontal"
    android:layout_weight="30">
    <Button
        android:id="@+id/new_order_button"
        android:layout_width="0px"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="@string/new_order" 
    />

    <Button
        android:id="@+id/previous_orders_button"
        android:layout_width="0px"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="@string/previous_orders" 
    />
</LinearLayout >

编辑:更新的代码......警告仍然存在

谢谢:)

4 个答案:

答案 0 :(得分:0)

实际上我觉得编辑抱怨说因为嵌套权重效率不高。布局权重需要两次测量窗口小部件,如果您有嵌套权重,则会以指数方式增加。

答案 1 :(得分:0)

您正在接收来自Lint的警告,因为计算嵌套权重很昂贵,并且必须在下一个图层之前计算最嵌套的部分。这会延迟将布局绘制到屏幕上,并且对性能不利。

您可以通过更改布局设计来解决这个问题。而不是让底部的Button任意占据屏幕的30%,您可以让他们只需要layout_height占用他们需要的wrap_content,或者将它们设置为静态高度使用#dp。然后,顶部的TextView会占据屏幕顶部的其余部分。这对于Android来说更容易绘制,因为没有任何嵌套权重可供计算。您的棉绒警告应该消失:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/news"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:gravity="top"
        android:textColor="#0033CC"
        android:textSize="14sp"
        android:textStyle="bold" />

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/new_order_button"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="50"
            android:text="@string/new_order" />

        <Button
            android:id="@+id/previous_orders_button"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="50"
            android:text="@string/previous_orders" />
    </LinearLayout>

答案 2 :(得分:0)

作为一种最佳实践,你不应该改变控件的大小(高度)(在这种情况下按钮)既不是绝对的也不是相对的 - android会为你制作它。在您的情况下,我只是创建一个FlowLayout作为根容器,然后将LinearLayout与两个按钮(每个产生50%的空间)放在底部。然后,TextView可以布局到LinearLayout的顶部,按钮占用剩余空间。但是,您仍然可以嵌套加权布局,但它对渲染性能来说不是最理想的。

答案 3 :(得分:0)

另一种可能性是在LinearLayout内部使用TableRows,然后将权重分配到TableRows,如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TableRow
        android:id="@+id/tableRow1"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="70" >

        <TextView
            android:id="@+id/news"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:gravity="top"
            android:textColor="#0033CC"
            android:textSize="14sp"
            android:textStyle="bold" />
    </TableRow>

    <TableRow
        android:id="@+id/tableRow2"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="30" >

        <Button
            android:id="@+id/new_order_button"
            android:layout_width="0px"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Button1" />

        <Button
            android:id="@+id/previous_orders_button"
            android:layout_width="0px"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Button2" />
    </TableRow>

</LinearLayout>