Android Universal App Approach
Я хочу разработать универсальное приложение. Я новичок в этом подходе. Это означает, что для приложения планшета и телефона используется один apk. Я прошел через
Библиотека поддержки
Fragments
Моя цель - создать другой пользовательский интерфейс для планшета и телефона внутри одного APk.
Я прочитал Получение вашего приложения для желе Bean и Nexus 7. В этой статье упоминается, что
res/layout/activity_home.xml
To take advantage of the extra space on the 7" screen you might provide an alternative layout:
res/layout-sw600dp/activity_home.xml
The sw600dp qualifier declares that these resources are for devices that have a screen with at least 600dp available on its smallest side.
Furthermore you might even provide a different layout for 10" tablets:
res/layout-sw720dp/activity_home.xml
Это означает, что мы можем использовать разные макеты для разных устройств. Это меня смущает
РЕДАКТИРОВАТЬ 1:: Сценарий
Предположим, что
if my phone UI layout contains one-view pager and
tablet UI layout contain two-view pager .
Как мы можем достичь этого? В этой статье говорится, что вы создаете разные макеты с тем же именем для разных экранов и сохраняете соответствующую папку. Но я сомневаюсь, что это приведет к исключениям, если он попытается инициализировать компонент виджета планшета планшета, когда приложение работает в телефоне.
ИЗМЕНИТЬ 2:
Идея пришла мне в голову - определить, какой тип устройства я использую, например Tab или телефон.
Определите, является ли устройство смартфоном или планшетом?
Затем избегайте инициализации виджетов, если приложение является телефоном. Есть ли лучший способ, чем это?
ИЗМЕНИТЬ 3:
Мое приложение поддерживает от 2,3 до более высоких версий
Если мои макеты для планшета содержат дополнительные виджеты по сравнению с макетом телефона. Как я инициализирую и использую. Надеюсь, все поняли мою потребность. Поэтому, пожалуйста, уточните мои сомнения.
Ответы
Ответ 1
Когда я сталкиваюсь с проблемой, я создаю следующую структуру.
res/layout
res/layout-sw600dp
затем, чтобы отличить значения и другие ресурсы,
res/values
res/values-sw600dp
res/values-sw720dp
Вы заметили, что существует только один макет и два значения, чтобы указать поля и paddings и другие ресурсы. Таким образом, единый макет можно использовать для планшета 7 дюймов, а также планшета 10 дюймов. Это мой сценарий, вы также можете определить layout-sw720dp. Я сделал это из-за сокращения времени компоновки макетов.
У меня также разные макеты телефона и планшета. Например, у меня есть ListView на первом экране, а затем, когда пользователь нажимает на элемент, он открывает другую активность, и для этого есть DetailView. Но в планшете у меня есть сторона ListView и правая сторона DetailView.
Чтобы сделать это, в значениях/строках, я помещаю следующий код,
<bool name="isTablet">false</bool>
и то же самое для таблиц значений-sw600dp/строк
<bool name="isTablet">true</bool>
Теперь переходим к части кодирования. У меня есть заставка и с общим расположением. Таким образом, он отобразит общий экран. Но когда пользователь нажимает на любую кнопку, он проверяет, является ли это планшет или нет. Чтобы проверить это,
boolean isTablet = getResources().getBoolean(R.bool.isTablet);
Теперь вы указываете, работает ли ваше приложение на телефоне или планшете.
Я создал два пакета,
com.phone
com.tablet
то в соответствии с флагом я направляю свою активность в пакет телефон и планшет.
Пример
if(isTablet)
startActivity(this,TabXYZ.class);
else
startActivity(this,PhXYZ.class);
И этот подход решил мою проблему.
Ответ 2
findViewById
вернет виджет в случае, если он присутствует в макете, null
в случае отсутствия такого виджета. Поэтому, если он возвращает ненулевое значение, вы можете продолжить инициализацию.