2015-06-25 5 views
0

У меня есть этот файл макет из главы 13 Android Programming: The Big Nerd Ranch Guide:layout_weight в андроиде файл макет

<?xml version="1.0" encoding="utf-8"?> 
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

    <ImageView 
     android:src="@drawable/armstrong_on_moon" 
     android:contentDescription="@string/hellomoon_description" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:scaleType="centerInside" 
     android:layout_weight="1"/> 

    <TableRow 
     android:gravity="center|bottom" 
     android:layout_weight="0"> 

     <Button 
      android:id="@+id/hellomoon_playButton" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@string/hellomoon_play"/> 

     <Button 
      android:id="@+id/hellomoon_stopButton" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@string/hellomoon_stop"/> 

    </TableRow> 

</TableLayout> 

И это приводит к макету, который выглядит как this. То, что я не понимаю, как TableRow проявляется в макете вообще, так как его layout_weight является 0 и ImageView «s layout_weight равен 1. Я понимаю, что путь layout_weight работы это первый будет уважать layout_width и layout_height каждого элемента , а затем разделите пространство между элементами на основе layout_weight. Но так как ImageView имеет match_parent как для своих layout_width, так и для layout_height, не должен ли он занимать весь экран, а затем оставить ничего, чтобы разделить с TableRow? Я считаю, что TableRow также имеет match_parent для своих layout_width и layout_height атрибутов, так как он унаследовал их от TableLayout, но так как он пришел второй, я подумал, что ImageView будет доминировать на экране. Кроме того, даже если ImageView не должен занимать весь экран, не являются layout_weights, говоря, что ImageView должен получить 100% оставшегося пространства, а TableRow должен получить 0%? Кроме того, когда я увеличиваю layout_weightTableRow, TableRow просто получает больше и больше от экрана, так как он увеличивается больше, но я думал, что это должно увеличить пространство, которое TableRow занимает на экране. Может кто-нибудь объяснить, что я не понимаю здесь.

В случае это помогает, мое понимание для layout_weight приходит из этого примера в книге:

**How android:layout_weight works** 
... 

LinearLayout makes two passes to set the width of a view. In the first pass, LinearLayout looks at layout_width (or layout_height, for vertical orientation). The value for layout_width for both the Button and CheckBox is now wrap_content, so each view will get only enough space to draw itself (Figure 8.12). 

... 

In the next pass, LinearLayout allocates any extra space based on the values for layout_weight. 

ответ

2

TableRow имеет высоту wrap_content. Это обеспечивается с помощью TableLayout, согласно documentation:

Дети в TableLayout не может указать layout_width атрибут. Ширина всегда MATCH_PARENT. Однако атрибут layout_height может быть определен дочерним элементом; Значение по умолчанию - WRAP_CONTENT. Если дочерним является TableRow, тогда высота всегда WRAP_CONTENT.

TableLayout и TableRow оба LinearLayout подклассов, но я испытал то же странное поведение, когда я создал макет, как в вашем посте. Просмотр источника TableLayout и TableRow, мне не сразу понятно, что из-за этого (очевидно, в измерительном коде есть некоторая переопределенная логика, но на самом деле это не очень удобно вычислять такие вещи, как столбцы, а также настраивать ширину столбцов и т. Д., Но я 'd придется копать больше, чтобы выяснить, что происходит).

Если этот пример на самом деле не нуждается в/использует некоторые специальные поведения TableLayout и TableRow, я бы посоветовал просто использовать LinearLayout S вместо ради ясности. Наличие layout_weight с этими двумя видами откровенно запутывает и явно не ведет себя так, как ожидалось. В любом случае вам даже не нужен layout_weight="0", whether you use two LinearLayout`s или оставить пример как есть.

Смежные вопросы