1

我想要实现的是拥有一个 TextView,它占据了大约 70% 的屏幕,其余的 30% 被平均分配在并排设置的 2 个按钮之间(水平)。我实现这一目标的唯一方法是使用下面的代码......但是 xml 编辑器抱怨嵌套的 wights......虽然它有效,但我理解这不是好的做法......我应该怎么做呢?

<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

4 回答 4

0

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

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

<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>
于 2013-04-10T19:00:27.937 回答
0

作为最佳实践,您不应该更改控件​​(在这种情况下为按钮)的大小(高度),无论是绝对的还是相对的 - android 都会为您完成。在您的情况下,我只需创建一个 FlowLayout 作为根容器,然后将带有两个按钮(每个按钮产生 50% 的空间)的 LinearLayout 放在底部。然后,您可以将 TextView 布局到 LinearLayout 的顶部,其中按钮占据剩余空间。但是,您仍然可以嵌套加权布局,但它对渲染性能并不理想。

于 2013-04-10T19:01:11.383 回答
0

实际上,我认为编辑在抱怨,因为嵌套权重效率不高。布局权重需要对一个小部件进行两次测量,如果您有嵌套权重,则会以指数方式增加。

于 2013-04-10T18:43:49.593 回答
0

另一种可能性是在内部使用LinearLayout带有 2的 a 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>
于 2013-04-10T19:09:24.943 回答