Как я могу использовать layout_width, используя файл ресурсов? - PullRequest
27 голосов
/ 28 июля 2011

Есть активность, что я хочу, чтобы заполнить экран в телефоне и всплывающее окно (диалоговое окно) для планшета.

Я думал, что создаю такой файл макета,

<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="@dimen/main_layout_width"
  android:layout_height="match_parent">

и введите значение ширины как

в значениях / измерениях. Xml

<dimen name="tutorial_width">match_parent</dimen>

в значениях-xlarge / измерения.xml

<dimen name="tutorial_width">320dp</dimen>

Но я не могу представить match_parent как элемент измерения. Любая помощь? Спасибо!

Ответы [ 8 ]

18 голосов
/ 09 марта 2012

Лучший способ, который я нашел: - вместо «match_parent» и «fill_parent» пишите «-1dp» - вместо «wrap_content» пишите «-2dp»

16 голосов
/ 19 октября 2013

dp зависит от показателей отображения устройства и не будет работать на всех устройствах без набора наложений, зависящих от плотности, однако вместо этого можно использовать px.

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

final int res = (int)(f+0.5f);
if (res != 0) return res;
if (value == 0) return 0;
if (value > 0) return 1;
return -1;

Когда f (значение px) отрицательно, результат обычно округляется неправильно, потому что он всегда использует сложение. Следующие размеры в пикселях наблюдаются для отрицательных px размеров:

0px = 0.0
-1px = -1.0
-2px = -1.0
-3px = -2.0
-4px = -3.0
-5px = -4.0
...

Я открыл проблему AOSP для этого метода:

TypedValue # complexToDimensionPixelSize () неправильно округляет отрицательные размеры

Учитывая это поведение, следующие значения будут работать на всех устройствах:

<dimen name="match_parent">-2px</dimen>
<dimen name="wrap_content">-3px</dimen>

Вы можете использовать -1px или -2px для match_parent, но wrap_content должно быть -3px. Любая комбинация работает на устройствах и эмуляторах.

На практике я обнаружил, что функция предварительного просмотра IntelliJ не отображает макеты, когда -1px используется для match_parent, и неправильно отображает -2px, как если бы это было "wrap_content", если на него ссылается другое измерение, например. <dimen name="my_width">@dimen/match_parent</dimen>. Я открыл вопрос для IntelliJ IDEA:

Предварительный просмотр Android не может отображать layout_width = "- 1px"

9 голосов
/ 26 мая 2013

Я использовал стиль, чтобы исправить эту проблему.Наличие отдельных элементов стиля xml с android: элементы layout_width для экранов разных размеров решили проблему без использования недокументированного -1dp

3 голосов
/ 24 февраля 2016

Что работает для меня и, вероятно, показывает академическую корректность примерно так:

<!-- In values/dimens.xml -->
<item name="width_match_unless_huge" type="dimen" format="integer">-1</item>

<!-- In values-sw600dp/dimens.xml -->
<item name="width_match_unless_huge" type="dimen" format="dimension">600dp</item>

Это позволяет смешивать константы поведения размеров, такие как MATCH_PARENT и конкретные размеры в dp в зависимости от текущей конфигурации.

Вы бы использовали его как обычный <dimen/>:

<LinearLayout
    android:layout_width="@dimen/width_match_unless_huge"
    .../>
3 голосов
/ 07 августа 2013

Я пока не могу комментировать, поэтому пишу новый ответ. Я использовал ответ, предоставленный @pjanecze в моем проекте. Все было хорошо до нескольких дней назад, когда вдруг некоторые устройства начали сообщать о странном позиционировании виджета. Устройства с очень высокой плотностью, вместо того, чтобы получить match_parent как -1 из моих измерений (что было эквивалентно android-константе match_parent = -1 в параметрах макета), он получал -2, что означает, что ширина была установлена ​​в wrap_content (-2 layout_parameters). Очевидно, потому что -1dp преобразуется в пиксели во время выполнения, а -1dp был в некоторых случаях -2px.

Итак ... вместо использования констант -1dp и -2dp, вы должны использовать -1px и -2px для match_parent и wrap_content.

2 голосов
/ 25 мая 2016

Согласно этому великому вкладу: http://blog.danlew.net/2015/01/06/handling-android-resources-with-non-standard-formats/

  1. Давайте попробуем определить и match_parent, и wrap_content без формата:

    <item name="match_parent" type="dimen">-1</item>
    <item name="wrap_content" type="dimen">-2</item>
    
  2. Мы можем ссылаться на них в любом другом измерении:

    <!-- Inside /res/values/dimens.xml -->
    <dimen name="responsive_width">@dimen/match_parent</dimen>
    
    <!-- Inside /res/values-sw800dp/dimens.xml -->
    <dimen name="responsive_width">800dp</dimen> 
    

Для получения дополнительной информации посетите веб-страницу, о которой я упоминал ранее!

0 голосов
/ 24 февраля 2014

Как упоминалось ранее в https://developer.android.com/reference/android/view/ViewGroup.LayoutParams.html#MATCH_PARENT MATCH_PARENT = -1 и WRAP_CONTENT = -2. Вместо того, чтобы объявлять значения как ресурсы Dimension, я успешно объявил и использовал их как целочисленные ресурсы. Таким образом, для работы примера вы можете использовать два файла ресурсов Integer:

Значения / integers.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="tutorial_width">-1</integer>
</resources>

Значения-sw600dp / integers.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="tutorial_width">-2</integer>
</resources>

И файл макета будет:

<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="@integer/tutorial_width"
  android:layout_height="match_parent">
0 голосов
/ 28 июля 2011

Вы можете создать две раскладки - по умолчанию с android: layout_height = "match_parent" в директории "layout" и для планшета android: layout_height = "320dp" в "layout-xlarge" dir

...