Использование RelativeLayout вместо вложенных весов

Я работал над простым устройством для звукового сопровождения. Основной дизайн - это изображение для названия, за которым следуют 4 ряда кнопок (по 3 в каждой строке), что делает его похожим на старые кнопки сотового телефона. Внизу есть кнопка "random" и "stop". Они занимают немного меньше пространства по высоте, чем строки, упомянутые выше, но случайная кнопка была двойной ширины, чтобы заполнить пространство.

Чтобы добиться этого, я использовал вложенные веса и линейные макеты. Однако после дальнейших исследований я обнаружил, что это плохо для производительности, потому что в моем текущем формате каждый элемент измеряется 8 раз. Ниже приведен мой код макета XML. Я исключил множество модификаций интерфейса, таких как поля, текст и тени на кнопках, чтобы уменьшить код. Код может показаться длинным, но он повторяется и прост для понимания.

<!--?xml version="1.0" encoding="utf-8"?-->
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:weightsum="23">

<!-- Insert Title/Picture in Linear Layout below -->



<!-- Insert Sounds/Buttons in Linear Layout below -->

<linearlayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="5" android:orientation="vertical" android:weightsum="4">

 <!-- This is the 1st line of buttons -->

 <linearlayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:orientation="horizontal" android:weightsum="3">

 <button android:id="@+id/bIntro" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/hello_real_select">

 </button><button android:id="@+id/bIntro" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/hello_real_select">

 </button><button android:id="@+id/bIntro" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/hello_real_select">
 

 <!-- This is the 2nd line of buttons -->

 <linearlayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:orientation="horizontal" android:weightsum="3">

 </linearlayout></button><button android:id="@+id/bIntro" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/hello_real_select">

 </button><button android:id="@+id/bIntro" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/hello_real_select">

 </button><button android:id="@+id/bIntro" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/hello_real_select">
 

 <!-- This is the 3rd line of buttons -->

 <linearlayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:orientation="horizontal" android:weightsum="3">

 </linearlayout></button><button android:id="@+id/bIntro" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/hello_real_select">

 </button><button android:id="@+id/bIntro" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/hello_real_select">

 </button><button android:id="@+id/bIntro" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/hello_real_select">
 

 <!-- This is the 4th line of buttons -->

 <linearlayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:orientation="horizontal" android:weightsum="3">

 </linearlayout></button><button android:id="@+id/bIntro" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/hello_real_select">

 </button><button android:id="@+id/bIntro" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/hello_real_select">

 </button><button android:id="@+id/bIntro" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/hello_real_select">
 


<!-- Random Button and Stop button below here -->

<linearlayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="9" android:orientation="horizontal" android:weightsum="3">

 </linearlayout></button><button android:id="@+id/bIntro" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/hello_real_select">

 </button></linearlayout></linearlayout></linearlayout><button android:id="@+id/bIntro" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/hello_real_select"> <p> Я новичок в Android, поэтому, хотя я и пытался использовать Relative layout, мне было очень трудно работать с ним. Я пробовал смотреть учебники онлайн, но все же он никогда не выглядел правильным, когда я использовал его в своем коде. Например, у моего заголовочного изображения есть дополнительное пространство выше и ниже фактического текста, который я хочу отобразить. В Linear Layout с весами он автоматически станет меньше, чтобы соответствовать пространству, которое я ему дал. Однако не в RelativeLayout.</p> <p> Я предполагаю, что я пытаюсь спросить здесь: как это сделать, поэтому мои элементы RelativeLayout являются равномерно распределенными кнопками в нескольких строках (как показано в примере выше) и как я могу сделать так, чтобы ImageViews и другие вещи фактически были автоматически размер до места, которое я им даю? Если вам нужна дополнительная информация, пожалуйста, не стесняйтесь спрашивать. Благодарю.</p> </button>
2 ответа

Вы правы, что RelativeLayout трудно сделать в таблицах, таких как тот, который вы сделали выше. LinearLayout действительно идеально подходит для этого, поэтому группы просмотра TableLayout и TableRow являются подклассами LinearLayout. Однако я могу порекомендовать несколько альтернатив, кроме RelativeLayout что увеличит эффективность макета.

Во-первых, вы можете исключить второй вертикально ориентированный LinearLayout и изменить вес макета первых 4 рядов кнопок от 1 до 1,25. Это уменьшит количество макетов от 8 до 4, что лучше всего подходит для таблицы.

<!--?xml version="1.0" encoding="utf-8"?-->
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:weightsum="23">

 <!-- Insert Title/Picture in Linear Layout below -->

 <linearlayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="9" android:background="@drawable/etho_logo" android:orientation="horizontal">
 </linearlayout>

 <!-- This is the 1st line of buttons -->

 <linearlayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1.25" android:orientation="horizontal" android:weightsum="3">

 <!-- 3 buttons here -->

 </linearlayout>

 <!-- This is the 2nd line of buttons -->

 <linearlayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1.25" android:orientation="horizontal" android:weightsum="3">

 <!-- 3 buttons here -->

 </linearlayout>

 <!-- This is the 3rd line of buttons -->

 <linearlayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1.25" android:orientation="horizontal" android:weightsum="3">

 <!-- 3 buttons here -->

 </linearlayout>

 <!-- This is the 4th line of buttons -->

 <linearlayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1.25" android:orientation="horizontal" android:weightsum="3">

 <!-- 3 buttons here -->

 </linearlayout>

 <!-- Random Button and Stop button below here -->

 <linearlayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="9" android:orientation="horizontal" android:weightsum="3">

 <button android:id="@+id/bIntro" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/hello_real_select">

 </button></linearlayout></linearlayout><button android:id="@+id/bIntro" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/hello_real_select"><code></code> <p> Другой вариант - использовать единый макет, который создает "плоскую" сетку (<code>ViewGroup</code> которая <code>ViewGroup</code> управляет раскладкой своих детей в таблицу). Если вы ориентируетесь на уровень API 14+ для своего приложения, вы можете посмотреть <a href="http://developer.android.com/reference/android/widget/GridLayout.html" rel="nofollow noreferrer" target="_blank"> <code>GridLayout</code></a>. Если вы ориентируетесь на уровень API до 14, возможно, вам придется сделать свой собственный. В заключительной заметке, пожалуйста, не путайте <code>GridLayout</code> с группой представления <a href="http://developer.android.com/reference/android/widget/GridView.html" rel="nofollow noreferrer" target="_blank"> <code>GridView</code></a>, которая предназначена для использования со списками и не будет выполнять то, что вы хотите.</p> </button>


Рекомендуется использовать ширину 0dp с весом, что должно уменьшать вдвое количество измерений (поскольку wrap_content требует измерения, но 0dp не делает)

Кроме того, вам не нужна стробированная вертикальная линейная компоновка, поскольку она уже находится в линейном макете (хотя она удобна для чтения, вы можете удалить ее для оптимизации и настройки веса)

licensed under cc by-sa 3.0 with attribution.