Ответ 1
Лучший способ найти: - вместо "match_parent" и "fill_parent" пишут "-1dp" - вместо "wrap_content" пишите "-2dp"
Есть активность, которую я хочу заполнить экраном в телефоне и всплывающее окно (диалоговое окно) для планшета.
Я думал, что создаю такой файл макета,
<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. Любая помощь? Спасибо!
Лучший способ найти: - вместо "match_parent" и "fill_parent" пишут "-1dp" - вместо "wrap_content" пишите "-2dp"
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 проблему:
Я использовал стиль, чтобы исправить эту проблему. Наличие отдельных элементов стиля xml с элементами android: layout_width для разных размеров экрана решает проблему без использования недокументированного -1dp
Я еще не могу прокомментировать, поэтому я пишу новый ответ. Я использовал ответ, предоставленный @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.
Что работает для меня и, вероятно, имеет академическую правильность, это примерно так:
<!-- 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"
.../>
Согласно этому большому вкладу: 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>
Для получения дополнительной информации посетите веб-страницу, о которой я упоминал ранее!
Вы можете создать два макета - по умолчанию с android: layout_height = "match_parent" в директории layout и для планшета Android: layout_height = "320dp" в директории layout-xlarge
Как упоминалось ранее в 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">