Несоответствия в выборе ресурсов Android и их значениях
Проблема, с которой я столкнулся, указывает на то, что корзина ресурсов выбирается для данного действияlayout
XML несовместим с ресурсами, выбранными изvalues
папка, несмотря на одинаковые квалификаторы ресурса, используемые в каждом наборе папок.
После размещения кода регистрации в моем приложенииС абстрактной родительской активностью я вижу, что при запуске моего приложения через эмулятор типа Nexus 7 (Android 4.1) наименьшая ширина действительно составляет 600 dp,layout-sw600dp-*
папка используется для получения пользовательского интерфейса для действия, но папка, используемая дляvalues
являетсяvalues-large-*
, Я ожидал, что это будетvalues-sw600dp-*
таким образом, предоставляя мне жизненно важную информацию о том, под каким ресурсом ведется деятельность.
Код делает запись в моем приложении »s родительская активность для всех sandroid.app.Activity
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final Configuration config = getResources().getConfiguration();
Log.i(this.getClass().getSimpleName(), String.format("Smallest width is [%s]", config.smallestScreenWidthDp));
configurationContext = SupportedDeviceConfiguration.fromResourceQualifer(getString(string.resourceQualifier));
Log.i(this.getClass().getSimpleName(), String.format("Running under the [%s] configuration context.", configurationContext.getResourceQualifier()));
...
Регистрация выходных данных, когда я запускаю этот код на устройстве типа Nexus 7;
[Logging fluff] Smallest width is [600]
[Logging fluff] Running under the [layout-large-land] configuration context.
Я знаю, что ты думаешь - откуда этомакета большой земли происхождение? Читать дальше...
ФонЯ испытываю подход, изложенныйВот который позволил бы мне проверять ресурсы, используемые во время выполнения. По сути, реализованный мною подход имеет следующую структуру квалификаторов ресурсов;
- res
+ layout // Default portrait layout.
+ layout-land // Default landscape layout
+ layout-large-land // pre 3.2 phablet landscape layout (Galaxy Note at v2.3.3)
+ layout-xlarge-land // pre 3.2 tablet landscape layout
+ layout-xlarge-port // pre 3.2 tablet portrait layout
+ layout-sw520dp-port // post 3.1 phablet portrait layout (Galaxy Note at v4.0.3)
+ layout-sw520dp-land // post 3.1 phablet landscape layout
+ layout-sw600dp-port // post 3.1 mini-tablet portrait layout (Nexus 7)
+ layout-sw600dp-land // post 3.1 mini-tablet-landscape layout
+ layout-sw700dp-port // post 3.1 tablet portrait layout
+ layout-sw700dp-land // post 3.1 tablet landscape layout
- values // Contains the root strings.xml
strings.xml
- values-land
default-config.xml
- values-large-land
default-config.xml
- values-xlarge-land
default-config.xml
- values-xlarge-port
default-config.xml
- values-sw520dp-port
default-config.xml
- values-sw520dp-land
default-config.xml
- values-sw600dp-port
default-config.xml
- values-sw600dp-land
default-config.xml
- values-sw700dp-port
default-config.xml
- values-sw700dp-land
default-config.xml
Так по сутиvalues
классификаторы отражают это изlayout
классификаторы. Под каждым изvalues-*
папки, которые я определил один файл XML под названиемdevice-config.xml
с содержанием;
layout-{qualifier of values folder}
Так, например,values-sw600dp-land
подпапкеdevice-config.xml
содержит одну строку со значениемlayout-sw600dp-land
, Цель в том, чтобы мой код оставался синхронизированным с макетами ресурсов, отображаемыми на экране. Это необходимо для того, чтобы мой код нене уходипоиск по идентификатору какой-то предмет, который нене существует на отображаемом макете в связи с недвижимостью.
Более глубокие соображения о желании узнать, какой контейнер используется во время выполнения, возникли из-за осознания того, что мой код с одним фрагментом для всех конфигураций становится трудным для управления с помощью различной логики на основе коммутатора, которая была непрозрачной и часто дублировала функции от другие макеты ... это было так, как будто мне нужно было какое-тоНаследование фрагментов ... что, если вы перейдете по ссылке, это именно то, что я сделал. Недостатком этого является то, что мне нужно знать, с каким экраном я работаю, прежде чем дать указание платформе создать экземпляр фрагмента x, y или z, поскольку известно, что создаваемый фрагмент никогда не будет синхронизирован с макетом, который он использует. предназначен для раздувания. Это наследование работает и позволяет получить гораздо более управляемый стек фрагментов (Сонар тоже счастливее, что приятно).
РезюмеТем не менее, я был потрясен этим очевидным несоответствием между тем, какая папка макета и папка значений выбирается фреймворком. Каждый из них имеет одинаковые квалификаторы, поэтому почемуДеятельность, использующаяlayout-sw600dp-land
Пользовательский интерфейс XML используетvalues-sw600dp-land
ресурс? Я надеюсь, что яу меня что-то не так, потому что это было самое лучшее из потенциальных решений, опубликованных в обсуждении SO, на которое я ссылался выше.