Проблема
Как вы уже упоминали, проблема в том, что больше доступного места на экране . Это означает, что вам нужно изменить размер кнопок в соответствии с доступным пространством, например, заполните доступную ширину дисплея 4 кнопками и масштабируйте их высоту так, чтобы соотношение сторон графики оставалось неизменным.
Здесь вы используете dp
юнитов, что абсолютно нормально и является хорошей практикой при определении макетов. Но в этом случае он говорит макету «эта вещь имеет фиксированный размер XX dp» (вы можете думать о dp как о фиксированной единице, фиксированное количество определяется устройством, отображающим макет), Вы не хотите фиксированный размер. Вы хотите, чтобы кнопки растягивались динамически.
Решение
Чтобы обеспечить решение для вышеприведенного макета: Вы можете использовать LinearLayout
и его атрибут layout_weight
. Вот несколько коротких (неполных) примеров кода, иллюстрирующих принцип:
<LinearLayout android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<Button android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
/>
<Button android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
/>
<Button android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
/>
<Button android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
/>
</LinearLayout>
Что здесь происходит?
Сначала мы создаем внешний LinearLayout
, который заполняет всю родительскую ширину (= всю ширину экрана) и регулирует его высоту в зависимости от содержимого. Стандартный материал.
Затем мы добавляем 4 кнопки. Соответствующий кусок здесь layout_weight
. Это говорит каждой кнопке «заполнить доступное пространство как можно больше». Так как каждый пытается растянуть сейчас, мы должны определить, сколько места занимает каждая кнопка. Это число, данное layout_weight
. Здесь у нас есть равное число один для каждой кнопки. Это означает, что каждая кнопка будет такого же размера, как и любая другая. Итак, как макет определяет, сколько места это? Он вычисляет общий вес своих детей, который здесь равен 4, и дает каждому ребенку пространство в соответствии с отношением child_weight / total_weight. Таким образом, каждая кнопка занимает 1/4 ширины. (Вы также можете назначить любой другой номер, если вы дадите каждой кнопке вес 3, каждая кнопка получит 3/12 ширины, что по-прежнему составляет 1/4 в соответствии с математикой :))
Остается один вопрос: почему layout_width="0dp"
? Это только предотвращает некоторые ненужные внутренние вычисления внутри, насколько я знаю. Все, что вам нужно знать, это использовать 0dp для измерения масштабирования при использовании атрибута layout_weight
. Вы можете немного изучить, если хотите узнать больше.
Образцы
Вот два скриншота этого на практике:
2,7 "QVGA
3,7 "FWVGA