Как установить максимальную ширину для макета - PullRequest
23 голосов
/ 16 января 2012

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

<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>

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

Ответы [ 5 ]

46 голосов
/ 03 февраля 2015

Правильно хранить разные файлы макетов в соответствии с предложением @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

14 голосов
/ 16 января 2012

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

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

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

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

Создайте другой файл и поместите его в res / layout-large / form.xml . Этот файл макета будет использоваться на устройствах с физическим размером экрана> ~ 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) ее родителя. Это более эффективно, чем пытаться установить максимальную ширину, особенно когда устройства имеют переменные разрешения и пропорции.

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

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

Подробнее о TableLayout можно найти в документации SDK .

НТН

2 голосов
/ 16 января 2012

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

0 голосов
/ 26 июля 2016

Эта библиотека BoundedViews помогает вам установить ограничения для maxWidth / maxHeight

0 голосов
/ 16 января 2012

см. Ссылку или просто установите значение

      android:layout_width="fill_parent"
      android:layout_height="fill_parent"

http://developer.android.com/guide/practices/screens_support.html

...