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

Как использовать layout_width с помощью файла ресурсов?

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

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

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

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

в значениях /dimens.xml

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

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

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

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

4b9b3361

Ответ 1

Лучший способ найти: - вместо "match_parent" и "fill_parent" пишут "-1dp" - вместо "wrap_content" пишите "-2dp"

Ответ 2

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 Preview не может отображать макеты, когда -1px используется для match_parent, и неправильно отображает -2px, как если бы он был "wrap_content", когда ссылался на другое измерение, например. <dimen name="my_width">@dimen/match_parent</dimen>. Я открыл для IntelliJ IDEA проблему:

Android Preview не может отобразить layout_width = "- 1px"

Ответ 3

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

Ответ 4

Я еще не могу прокомментировать, поэтому я пишу новый ответ. Я использовал ответ, предоставленный @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.

Ответ 5

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

<!-- 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"
    .../>

Ответ 6

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

  • Попробуйте определить как match_parent, так и wrap_content без формата:

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

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

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

Ответ 7

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

Ответ 8

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