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