Как настроить таргетинг на разрешение 1280x720 WXGA720 (как в новом Galaxy Nexus) в папках Android Layout?

При тестировании моего приложения с разрешением WXGA720 на эмуляторе Android 4.0.3 Ice Cream Sandwich мое приложение берет ресурсы макета из папки layout-normal-land-854x480 в альбомной ориентации и папки layout-port-480x320 в портретной ориентации. Я хотел бы иметь возможность специально настроить это разрешение, чтобы мое приложение правильно отображалось на новых телефонах. Как мне это сделать? Я пробовал следующее...

layout-normal-land-xhdpi
layout-normal-port-xhdpi
layout-normal-land-xlarge
layout-normal-land-large
layout-normal-land- 1280x720
layout-normal-port-1280x720 и т. д.

... и он по-прежнему берет ресурсы из неправильных папок, описанных выше.

Мое приложение ориентировано на Android 2.1 (который, как я полагаю, по-прежнему является стандартной целью в наши дни), поэтому, насколько мне известно, я не могу использовать новые квалификаторы макета. Это ошибка? У кого-нибудь была такая же проблема и нашел обходной путь?

У меня есть следующая конфигурация папок, и все остальные AVD отображаются так, как ожидалось:

layout
layout-land
layout-normal-land-480x320
layout-normal-land-854x480
layout-port-480x320
layout-port-800x480


person Matt W    schedule 25.01.2012    source источник
comment
Та же проблема, не берет ресурсы из папки xhdpi. Я объявил тег support-screens с помощью android:largeScreens=true... похоже, это не помогает. xlargeScreens поддерживается из API 9, я разрабатываю для 7, может в этом проблема?   -  person User    schedule 22.07.2012


Ответы (3)


При тестировании моего приложения с разрешением WGXA720 на эмуляторе Android под управлением 4.0.3 Ice Cream Sandwich мое приложение берет ресурсы макета из папки layout-normal-land-854x480 в альбомной ориентации и папки layout-port-480x320 в портретной ориентации.

Если бы мне пришлось угадывать, у вас нет допустимого элемента <supports-screens> (или, возможно, нет android:minSdkVersion) в вашем манифесте, и поэтому вы перешли в режим совместимости.

Кроме того, пожалуйста, не используйте суффиксы, такие как -480x320 и -854x480. Они были удалены из документации по определенной причине. Какую бы проблему, по вашему мнению, вы решали с ними, лучше решить каким-то другим способом.

Мое приложение ориентировано на Android 2.1 (который, как я полагаю, по-прежнему является стандартной целью в наши дни), поэтому, насколько мне известно, я не могу использовать новые квалификаторы макета.

Вы можете установить цель сборки на более высокий уровень и использовать новые квалификаторы макета. Однако более старые устройства будут игнорировать их, поэтому вам все равно придется использовать для них -normal и -land, а также kin параллельно с любыми наборами ресурсов с новыми квалификаторами. Вы можете создавать псевдонимы ресурсов, чтобы свести к минимуму дублирование кода.

person CommonsWare    schedule 25.01.2012
comment
Я ценю помощь, но я все еще полностью застрял после работы над этим в течение последних нескольких часов. Я удалил специфичные для пикселей суффиксы и попытался заменить их просто «большими» или «hdpi» и т. Д., И каждый AVD использовал папку «mdpi», независимо от того, какой на самом деле была плотность или разрешение экрана. Согласно документам: эти минимальные размеры экрана не были так четко определены до Android 3.0, поэтому вы можете столкнуться с некоторыми устройствами, которые неправильно классифицируются между нормальными и большими. Следовательно, единственный способ для меня правильно определить макеты — это использовать суффиксы, специфичные для пикселей. - person Matt W; 26.01.2012
comment
Я также попытался добавить элемент ‹supports-screens› в файл манифеста, изменив цель сборки на 13 и используя новые квалификаторы макета (sw720dp). Единственный способ, которым я смог эффективно нацелиться на это, - это сделать это программно, получив ширину устройства и изменив параметры макета с помощью кода - чего я пытаюсь избежать здесь. - person Matt W; 26.01.2012
comment
@MattW: Ваша среда разработки, должно быть, полностью испорчена. Такие вещи, как -large и -hdpi, прекрасно работают для десятков тысяч других разработчиков. Я понятия не имею, как помочь вам дальше. - person CommonsWare; 26.01.2012
comment
Та же проблема, не берет ресурсы из папки xhdpi. Я объявил тег support-screens с помощью android:largeScreens=true... похоже, это не помогает. xlargeScreens поддерживается из API 9, я разрабатываю для 7, может в этом проблема? - person User; 22.07.2012
comment
@lxx: -largeScreens не имеет абсолютно никакого отношения к -xhdpi. - person CommonsWare; 22.07.2012

У меня была аналогичная проблема с правильным отображением моих макетов, но я использовал HTC Rezound с разрешением 1280 на 720. Он использует Android версии 2.3.4. Мои экраны отображались только в верхней части дисплея, а нижняя треть была черной. Все отображалось правильно на телефонах с более низким разрешением.

Я выполнил упражнение по созданию новых каталогов макетов ( layout-xhdpi, layout-large, layout-1280x720, layout-1200x700 и т. д.) и изменению моих файлов макетов, чтобы они соответствовали большему разрешению, но каждая попытка не удалась, и приложение всегда отображалось в только верхняя часть экрана. Я прочитал документы с http://developer.android.com/guide/practices/screens_support.html и не нашел ничего, что решило бы проблему. Я, наконец, исправил это, и решение не имело ничего общего с добавлением новых каталогов макетов, настроенных для более высоких разрешений! Решение было связано с оператором «uses-sdk» в файле AndroidManifest.xml. Мой исходный манифест содержал утверждение:

<uses-sdk minSdkVersion="8"/>

Если указана только минимальная версия SDK, графика не будет правильно отображаться на Rezound. Однако после изменения только одной строки в AndroidManifest.xml (и без внесения других изменений) телефон правильно отображал все экраны:

<uses-sdk android:targetSdkVersion="9" minSdkVersion="8" />

Почему это исправило это, но не задокументированные методы? Я не знаю! Я нахожу много скрытых соединений в Android, которые не поддаются логическому объяснению. Может ли кто-нибудь объяснить мне, почему изменение оператора uses-sdk имеет решающее значение для отображения на дисплее с более высоким разрешением?

person Tary    schedule 17.04.2012
comment
Я думаю, что проблема может быть связана с Eclipse. Сейчас слишком поздно, чтобы определить это, но я предполагаю, что Eclipse очистил кеш и пересобрал ваш проект сразу после изменения targetSdkVersion, потому что это означает новые проверки кода и, следовательно, перекомпиляцию и так далее. Я заметил, что при работе с макетами Eclipse's Project - Clean часто помогает получить видимые изменения в графике. - person Stan; 08.05.2013

Я уже отвечал на этот вопрос раньше, но мой предыдущий ответ позволил мне заполнить только дисплей (раньше он заполнял только верхнюю треть), но я никогда не мог использовать альтернативный макет. Я использую HTC Rezound с дисплеем 1280 на 720. Мне нужно было выяснить, какой дисплей Android считает своим. Я добавил следующий код в свой обработчик onCreate:

// Figure out what kind of display we have
  int screenLayout = getResources().getConfiguration().screenLayout;

  if ((screenLayout & Configuration.SCREENLAYOUT_SIZE_SMALL) == Configuration.SCREENLAYOUT_SIZE_SMALL)
     LogMessage("Main onCreate", "Info", "Screen size is Small");
  else if ((screenLayout & Configuration.SCREENLAYOUT_SIZE_NORMAL) == Configuration.SCREENLAYOUT_SIZE_NORMAL)
     LogMessage("Main onCreate", "Info", "Screen size is Normal");
  else if ((screenLayout & Configuration.SCREENLAYOUT_SIZE_LARGE) == Configuration.SCREENLAYOUT_SIZE_LARGE)
     LogMessage("Main onCreate", "Info", "Screen size is Large");

  if ((screenLayout & Configuration.SCREENLAYOUT_LONG_YES) == Configuration.SCREENLAYOUT_LONG_YES)
     LogMessage("Main onCreate", "Info", "Screen size is Long");

  // Get the metrics
  DisplayMetrics metrics = new DisplayMetrics();
  getWindowManager().getDefaultDisplay().getMetrics(metrics);
  int heightPixels = metrics.heightPixels;
  int widthPixels = metrics.widthPixels;
  int densityDpi = metrics.densityDpi;
  float density = metrics.density;
  float scaledDensity = metrics.scaledDensity;
  float xdpi = metrics.xdpi;
  float ydpi = metrics.ydpi;

  LogMessage("Main onCreate", "Info", "Screen W x H pixels: " + widthPixels  + " x " + heightPixels);
  LogMessage("Main onCreate", "Info", "Screen X x Y dpi: " + xdpi + " x " + ydpi);
  LogMessage("Main onCreate", "Info", "density = " + density + "  scaledDensity = " + scaledDensity +
     "  densityDpi = " + densityDpi);

И результаты в журналах были:

Info, Main onCreate, Screen size is Normal
Info, Main onCreate, Screen size is Long
Info, Main onCreate, Screen W x H pixels: 720 x 1280
Info, Main onCreate, Screen X x Y dpi: 345.0566 x 342.23157
Info, Main onCreate, density = 2.0  scaledDensity = 2.0  densityDpi = 320

При этом я понял, что Android называет это обычным дисплеем, поэтому я создал каталог res/layout-normal-1280x720 с моими альтернативными файлами макета.

Мой манифест содержал:

<supports-screens
    android:largeScreens="true"
    android:normalScreens="true"
    android:smallScreens="true"
    android:anyDensity="true"
 />

<uses-sdk android:targetSdkVersion="9" android:minSdkVersion="8" />

С этими изменениями я, наконец, смог получить альтернативный макет для использования с этим телефоном.

person Tary    schedule 30.05.2012