Как настроить разрешение 1280x720 WXGA720 (как и у нового Galaxy Nexus) в папках Android Layout? - PullRequest
5 голосов
/ 25 января 2012

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

макет нормальной земля xhdpi
Макет-нормальный порт-xhdpi
макет нормальной земля XLarge
макет нормальной земля большой
макет нормальной земля 1280x720
layout-normal-port-1280x720 и т. д. ...

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

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

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

макет
планировка-земля
макет нормальная земля 480x320
макет нормальная земля 854x480
Макет-порта 480x320
расположение портов-800x480

Ответы [ 3 ]

5 голосов
/ 25 января 2012

При тестировании моего приложения с разрешением 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 для них параллельно с любыми наборами ресурсов с новыми квалификаторами.Вы можете создавать псевдонимы ресурсов, чтобы минимизировать дублирование кода.

1 голос
/ 30 мая 2012

Я уже отвечал на этот вопрос раньше, но мой предыдущий ответ только позволил мне заполнить экран (раньше он занимал только верхнюю треть), но я никогда не мог использовать альтернативный макет.Я использую 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" />

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

1 голос
/ 17 апреля 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 и не нашел ничего, что решило бы проблему.Я наконец исправил это, и решение не имело ничего общего с добавлением новых каталогов макетов, настроенных для более высоких разрешений!Решением было все о выражении «using-sdk» в файле AndroidManifest.xml.Мой оригинальный манифест содержал утверждение:

<uses-sdk minSdkVersion="8"/>

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

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

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

...