Подтвердить что ты не робот

Как установить максимальную ширину для макета

После многих поисковых запросов я не могу найти решение этой проблемы. У меня есть этот макет:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:id="@+id/adlayout"
          android:layout_width="fill_parent"
          android:layout_height="fill_parent"
          android:orientation="vertical">
<TableLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="vertical"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:stretchColumns="1"
   android:layout_weight="1"
  >

  <TableRow android:id="@+id/tableRow1" android:layout_width="fill_parent"   android:layout_height="wrap_content">
       <TextView android:padding="6dip" android:text="@string/barcode_format"  android:id="@+id/textView1" android:layout_width="wrap_content"   android:layout_height="wrap_content"></TextView>
       <EditText android:padding="6dip" android:layout_width="fill_parent" android:id="@+id/edit_barcode_format" android:layout_height="wrap_content"></EditText>
  </TableRow>
  <TableRow android:id="@+id/tableRow1" android:layout_width="fill_parent" android:layout_height="wrap_content">
      <TextView android:padding="6dip" android:text="@string/barcode_type" android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
      <EditText android:padding="6dip" android:layout_width="fill_parent" android:id="@+id/edit_barcode_type" android:layout_height="wrap_content"></EditText>
  </TableRow>        
 </TableLayout>


</LinearLayout>

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

4b9b3361

Ответ 1

Соответствующим способом обработки вашей ситуации является создание отдельного файла макета для оптимизации вида формы для планшетов при использовании существующего файла для телефонов. Вы делаете это, создавая отдельные каталоги res/layout с квалификаторами для размера экрана и/или разрешения, прикрепленного к ним.

Подробнее о доступных квалификаторах ресурсов можно прочитать здесь. Здесь есть несколько вариантов, и я оставлю это вам, чтобы выбрать лучшее для вашего приложения, но вот простой пример:

Предположим, что ваш текущий файл макета form.xml.

Поместите существующий файл макета в res/layout/form.xml. Это сделает его по умолчанию.

Создайте еще один файл и поместите его в res/layout-large/form.xml. Этот файл макета будет использоваться на устройствах с физическим размером экранa > ~ 5 "(все стандартные планшеты). Чтобы обработать вашу проблему, я изменил свой макет по умолчанию, чтобы отобразить форму, расположенную по горизонтали, и занимает всего 60% ширины экрана

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/adlayout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal"
    android:gravity="center_horizontal"
    android:weightSum="1" >

    <TableLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.6"
        android:stretchColumns="1" >

        <TableRow android:id="@+id/tableRow1">

            <TextView
                android:id="@+id/textView1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:padding="6dip"
                android:text="Barcode Format" >
            </TextView>

            <EditText
                android:id="@+id/edit_barcode_format"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:padding="6dip" >
            </EditText>
        </TableRow>

        <TableRow android:id="@+id/tableRow1">

            <TextView
                android:id="@+id/textView2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:padding="6dip"
                android:text="Barcode Type" >
            </TextView>

            <EditText
                android:id="@+id/edit_barcode_type"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:padding="6dip" >
            </EditText>
        </TableRow>
    </TableLayout>

</LinearLayout>

В этом изменении используются свойства layout_weight и weightSum LinearLayout, которые говорят, что таблица заполняет только 60% (layout_weight=0.6) своего родителя. Это более эффективно, чем пытаться установить максимальную ширину, особенно когда устройства имеют переменные разрешения и пропорции.

FYI, я также попытался удалить столько ненужных атрибутов, которые у вас были в вашем XML, которые ничего не делали, кроме создания беспорядка (например, нескольких объявлений xmlns:android). Одним из таких изменений было удаление дополнительных параметров layout_ у детей TableLayout, потому что TableLayout все равно игнорирует все эти параметры и заставляет своих детей использовать определенные ограничения. Из Документов:

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

Подробнее о TableLayout в документах SDK.

НТН

Ответ 2

Сохранение различных файлов макета по предложению @Devunwired является правильным, однако это добавляет сложности вашему проекту (вам нужно будет поддерживать несколько файлов, если дизайнер перепроектирует макет представления).

Если вам нужно изменить ширину кнопки, я бы предложил следующее. Храните один файл xml в папке макета и присвойте ему значение

<LinearLayout
    style="@style/width_match_parent_max_200"
    android:layout_height="wrap_content">

values-w600dp/styles.xml содержит

<resources>
    <style name="width_match_parent_max_200">
        <item name="android:layout_width">200dp</item>
    </style>
</resources>

values ​​/styles.xml содержит

<resources>
    <style name="width_match_parent_max_200">
        <item name="android:layout_width">match_parent</item>
    </style>
</resources>

Изменить: обратите внимание, что папка имеет значения-w600dp, а не значения-600dp

Ответ 3

Вам нужно создать новую ViewGroup, которая простирается от LinearLayout и ограничивает ее по желаемой ширине. См. этот ответ.

Ответ 4

Используйте ConstraintLayout. Внутри вы можете использовать эти свойства для минимальной/максимальной ширины/высоты:

  • app:layout_constraintWidth_min
  • app:layout_constraintWidth_max
  • app:layout_constraintHeight_min
  • app:layout_constraintHeight_max

Не забудьте установить ширину/высоту вашего просмотра в соответствии с ограничениями (0dp).