layout_weight в файле макета Android
У меня есть этот файл макета из главы 13 " Программирование на Android: руководство ранчо большого ботаника":
<?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>
И это приводит к макету, который выглядит следующим образом. Что я не понимаю, так это как 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_weight
из TableRow
, 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.
1 ответ
TableRow имеет высоту wrap_content
, Это обеспечивается TableLayout
согласно документации:
Дочерние элементы TableLayout не могут указывать атрибут layout_width. Ширина всегда MATCH_PARENT. Однако атрибут layout_height может быть определен дочерним элементом; значение по умолчанию - WRAP_CONTENT. Если дочерний элемент является TableRow, тогда высота всегда WRAP_CONTENT.
TableLayout
а также TableRow
оба LinearLayout
подклассы, но я испытал те же странные поведения, когда я создал макет, подобный тому, что в вашем посте. Просмотр источника TableLayout
а также TableRow
мне не сразу понятно, что вызывает это (ясно, что в измерительном коде есть некоторая переопределенная логика, но это не совсем удовлетворительно, чтобы вычислять такие вещи, как интервалы столбцов и регулировать ширину столбцов и тому подобное, но мне придется копать больше, чтобы выяснить, что происходит).
Если этот пример на самом деле не нуждается / не использует некоторые из TableLayout
а также TableRow
Я бы посоветовал просто использовать LinearLayout
Вместо этого ради ясности. Наличие layout_weight
с этими двумя взглядами откровенно смущает и явно не ведет себя, как ожидалось. В любом случае вам даже не нужно layout_weight="0", whether you use two
LinearLayout`s или оставьте пример как есть.