Несоответствия в выборе ресурсов 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, на которое я ссылался выше.

 S.D.19 окт. 2012 г., 07:11
Как насчет предоставления уникального идентификатора родителюGroupView каждого макета, так что вы можете сказать, какой макет используется здесь.
 OceanLife19 окт. 2012 г., 10:12
Привет @wingman - спасибо за ваш комментарий. Действительно, если я не понимаю, что здесь происходит, я буду использовать Грэхема Бордланда.предложениеВот, Любая идея, как Android 'В этом случае работает ли вывод ресурсов? Следуя логике механизма принятия решений, мы должны быть золотыми ... Я '

Ответы на вопрос(2)

sw720dp, необходимо использовать следующее ?: - values-sw600dp-port default-config.xml

- values-sw600dp-land default-config.xml

- values-sw700dp-port default-config.xml

- values-sw700dp-land default-config.xml, потому что яЯ не использую res / values-XXX и, кажется, работает нормально.

что тыимеет дело с приоритетом ресурса, используемого для выбора.

Если вы предоставляете папки:

layout-sw600dp-*
values-large-*
values-sw600dp-*

Android не обязан соответствоватьценности папка выбора для тех израсположениеСкорее он использует ту же логику приоритета отдельно для макета и отдельно для папки значений.

Вы можете узнать об этом алгоритме выбора здесь:http://developer.android.com/guide/topics/resources/providing-resources.html#BestMatch

 OceanLife28 окт. 2012 г., 15:01
Привет, Мыши. Спасибо за ваш ответ. Как и было обещано, щедрость ваша. Я собираюсь заполучить пост эклара с лучшим соответствием Android и разобрать, что происходит в тестовом примере. Когда я узнаю окончательную причину, яЯ вернусь сюда, и пусть массы узнают подробности несоответствия ... Я
 OceanLife22 окт. 2012 г., 16:22
Спасибо за ответ мышам. Действительно, я прочитал эту часть руководства разработчика и попытался изменить выбор, чтобы увидеть, что произошло. Я понимаю, что в документации нет ничего, чтоvalues- а такжеlayout- Логика выбора ресурса должна быть одинаковой. Позор это не 'т. Возможно этоПадение всего этого. Еще раз спасибо за ваш ответ. Я'Обязательно разложите товар до того, как закончится щедрость, если не появится ничего более определенного. :)

Ваш ответ на вопрос