2013-04-10 6 views
1

То, что я хочу достичь, - это иметь TextView, который занимает около 70% экрана, а остальная часть 30% разделяется EQUALY между двумя кнопками, установленными бок о бок (по горизонтали). Единственный способ, которым я достиг этого, - использовать код ниже ... однако редактор xml жалуется на вложенные wights ... хотя он работает, я понимаю, что это не хорошая практика ... Как мне это сделать?Вложенные весы 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: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 > 

EDIT: ОБНОВЛЕНО КОД ... предупреждения все еще присутствует

Спасибо :)

+0

Я не думаю, что есть какой-либо другой способ сделать это. – minipif

+0

Скопируйте и вставьте мое решение, никаких предупреждений;) –

ответ

0

Вы получаете предупреждение от Lint, потому что вычисление вложенных весов является дорогостоящим, а самая вложенная часть должна быть вычислена до того, как будет доступен следующий уровень. Это задерживает рисование макета на экране и плохо работает.

Вы можете обойти это, изменив дизайн макета. Вместо того, чтобы Button с снизу произвольно занимали 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> 
+0

A down? Я хотел бы знать, что не так с этим решением ... –

+0

Это не отвечает на поставленный вопрос. –

+0

@SkyKelsey OP спрашивает: «Хотя это работает, я понимаю, что это не хорошая практика ... Как мне это сделать?». Я предоставил решение, которое удаляет использование вложенных весов в макетах и, следовательно, предупреждение Lint. ОП принял и поддержал этот ответ, я бы счел это ответом на поставленный вопрос. –

0

На самом деле я думаю, что редактор жалуется, потому что наличие вложенного веса это не эффективно. Макеты компоновки требуют, чтобы виджет измерялся дважды, и если у вас есть вложенные веса, это увеличивается экспоненциально.

0

в качестве лучшей практики, вы не должны изменять размер (высота) управления (в данном случае кнопки) ни абсолютного, ни относительного - андроид будет делать это для вас. В вашем случае я просто создаю FlowLayout в качестве корневого контейнера, а затем поставлю LinearLayout с двумя кнопками (с 50% местами) внизу. Затем TextView вы можете разместить в верхней части LinearLayout с помощью кнопок, занимающих оставшееся пространство. Тем не менее, вы все же можете вложить взвешенные макеты, но его субоптимальные к производительности рендеринга.

0

Еще одна возможность заключается в том, чтобы использовать LinearLayout с 2 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>