Пристрої під Android можна умовно розділити на дві групи - телефони та планшети. До недавнього часу існували дві гілки розвитку платформи версії 2.* і версії 3.*. З виходом Android 4.0 обидві гілки були об'єднані і тепер скрізь використовується єдиний код. Але нехай ця обставина не вводить вас в оману.
Розробка під планшети дуже сильно відрізняється від розробки під звичайний смартфон.
Засоби розробки дозволяють досить зручно створювати програму під різні форм-фактори. Але є ряд особливостей, про які потрібно знати. По-перше, дизайнер форм і емулятор не зовсім точно показують розміри і взаємне розташування елементів. Необхідно завжди перевіряти кінцевий результат на реальному пристрої. По-друге, потрібно грамотно налаштувати середовище розробки під наші цілі.
Квалификаторы large/xlarge (застар.)
Існує спеціальний квалификатор large (res/layout-large та його похідні layout-large-land тощо), який діє на пристрої з екранами від 7 дюймів і вище. Зараз вважається застарілим, оскільки деякі пристрої не зовсім правильно визначали даний квалификатор. Часто в цілях сумісності створюють папку з даним квалификатором і копіюють файли з нових кваліфікаторов (або псевдоніми), про які нижче.
Теж саме відноситься до xlarge, який діє на пристрої з діагоналлю екрана 10 дюймів.
Квалификатор Smallest-width (sw)
В Android 3.2 і вище доступний квалификатор Smallest-width, скорочено sw. Він дозволяє визначати екрани з заданої мінімальної шириною в dp. Наприклад, планшет з екраном 7 дюймів має мінімальну ширину 600 dp, і якщо ви хочете, щоб додаток працював на ньому в двопанельному режимі (а на менших екранах в однопанельном), використовуйте два макета, але замість кваліфікатору розміру large вкажіть sw600dp. В такому разі на екранах, мінімальна ширина яких становить 600 dp, буде використовуватися двопанельний макет.
Далі мова піде стосовно планшету на 7 дюймів з роздільною здатністю екрану 1024×600. Ми вже звикли, що вся основна розмітка міститься у файлі activity_main, яка знаходиться в папці res/layout. Відмінно, почніть з цього файлу і накидайте макет для телефону. Тепер створіть нову папку res/layout-sw600dp/ і скопіюйте в неї файл activity_main.xml. У цій папці буде макет програми, спеціально розроблений з урахуванням семидюймового екрану. Тепер, в залежності де запускається програма, система сама автоматично обере потрібний макет і покаже його користувачеві.
Для планшетів на 10 дюймів використовуйте папку res/layout-sw720dp.
Квалификаторы width (w) і height (h)
Також можна використовувати квалификатор типу wXXXdp, де доступна ширина більше або дорівнює XXX dp, і квалификатор типу hXXXdp, де доступна висота більше або дорівнює XXX dp.
res/layout-w600dp/activity_main.xml
res/layout-w720dp/activity_main.xml
Псевдоніми
Слід врахувати, що на Android-пристрої до версії 3.2 квалификатор sw600dp не буде працювати, тому для них, як і раніше, потрібно використовувати large і вам буде потрібно ще один файл з назвою res/layout-large/main.xml ідентичний файлу res/layout-sw600dp/main.xml. Тому доводиться дублювати обидва файли з однаковим змістом.
Щоб уникнути дублювання файлів, використовуйте псевдоніми. Наприклад, можна визначити наступні режими: res/layout/main.xml (однопанельний макет); res/layout/main_twopanes.xml (двопанельний макет).
Додаємо нові папки з файлами:
res/values-large/layout.xml
<resources>
<item name="main" type="layout">@layout/main_twopanes</item>
</resources>
res/values-sw600dp/layout.xml
<resources>
<item name="main" type="layout">@layout/main_twopanes</item>
</resources>
Зміст останніх двох файлів однаковий, але самі по собі вони не визначають макет. Вони служать для того, щоб призначити файл main в якості псевдоніма main_twopanes. Так як в них використовуються селектори large і sw600dp, вони застосовуються до планшетів і телевізорів на платформі Android незалежно від версії (для версій до 3.2 використовується large, а для нових – sw600dp).
Кваліфікатори орієнтації
Так як число пристроїв з різними екранами зростає, то доводиться додатково адаптувати дизайн для маленьких екранів, планшетів на 7 і 10 дюймів, телевізорів. Ось приклади різних варіантів дизайну.
Маленький екран, вертикальна орієнтація: однопанельний вид з логотипом.
Маленький екран, горизонтальна орієнтація: однопанельний вид з логотипом.
Планшетний ПК з 7-дюймовим екраном, вертикальна орієнтація: однопанельний вид з панеллю дій.
Планшетний ПК з 7-дюймовим екраном, горизонтальна орієнтація: двопанельний вид з панеллю дій.
Планшетний ПК з 10-дюймовим екраном, вертикальна орієнтація: двопанельний вид (вузький варіант) з панеллю дій.
Планшетний ПК з 10-дюймовим екраном, горизонтальна орієнтація: двохпанельний вид (широкий варіант) з панеллю дій.
Телевізор, горизонтальна орієнтація: двопанельний вид з панеллю дій.
Кожен з цих макетів визначено в XML-файлі в каталозі res/layout/. Щоб зіставити їх з певними конфігураціями екрану, в додатку використовуються псевдоніми. Приклади можна подивитися в документації.
Також необхідно створити кілька нових емуляторів під ваші вимоги.
Другий важливий момент - вказівка розмірів. Зазвичай ми зберігаємо значення розмірів у файлі res/values/dimens.xml. Текст для телефону виявиться занадто дрібним для планшета. Тому аналогічно створюємо альтернативний файл res/values-sw600dp/dimens.xml.
Також можна керувати розмірами через стилі. У файлі res/values/styles.xml:
<style name="DescriptionTextStyle">
<item name="android:textAppearance">?android:attr/textAppearanceMedium</item>
</style>
У файлі res/values-sw600dp/styles.xml:
<style name="DescriptionTextStyle">
<item name="android:textAppearance">?android:attr/textAppearanceLarge</item>
</style>
Третій важливий момент, про який треба пам'ятати - відмінності в залізі. Наприклад, в новому планшеті Google Nexus 7 немає телефонного модуля і тільки одна фронтальна камера. Тому, в маніфесті рекомендується вказувати, що програма вимагає наявності телефону або камери, щоб ваш додаток не був доступний в магазині додатків для користувачів, у яких немає телефону і камери. Наприклад:
<uses-feature android:name="android.hardware.camera"
android:required="false"/>
<uses-feature android:name="android.hardware.microphone"
android:required="true"/>
Тобто ваша програма не вимагає наявності камери, але зобов'язує мати мікрофон.
Не забувайте про можливість налаштування маніфесту для великих екранів.
Робіть відступи 16dp як мінімум від країв екрана для текстів.
Довжина рядка не повинна бути занадто великою. Максимум 100 символів, оптимальний варіант: 50-75.
ListView і меню не повинні розтягуватися на весь екран (використовуйте фрагменти).
Рекомендований розмір для елементів, що працюють від пальця - 48dp (32dp як мінімум).
Підтримка планшетів, які вміють відправляти/приймати SMS, але не вміють дзвонити
Існують планшети з модулем, що дозволяє приймати і відправляти SMS. Для них варто встановити дозволи:
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
<uses-permission android:name="android.permission.READ_SMS"></uses-permission>
<uses-permission android:name="android.permission.WRITE_SMS"></uses-permission>
<uses-feature android:name="android.hardware.telephony" android:required="false" />
Тільки під планшети, тільки під телефони
Можна прописати в маніфесті різні налаштування, щоб програма виводилася в Google Play тільки під планшети або тільки під телефони. Приблизно так.
Під планшети
<supports-screens
android:largeScreens="false"
android:normalScreens="false"
android:requiresSmallestWidthDp="600"
android:smallScreens="false"
android:xlargeScreens="true" />
Під телефони
<supports-screens
android:anyDensity="true"
android:largeScreens="true"
android:largestWidthLimitDp="600"
android:normalScreens="true"
android:resizeable="true"
android:smallScreens="true"
android:xlargeScreens="false" />