2013-05-21 2 views
10

Я хочу разработать универсальное приложение. Я новичок в этом подходе. Это означает, что для приложения планшета и телефона используется один apk. Я должен был пройти черезAndroid Universal App Approach

Support Library

Fragments

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

Я читал Getting Your App Ready for Jelly Bean and 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 

Это означает, что мы можем использовать различные макеты для разных устройств. Это меня смущает

EDIT 1 :: Сценарий

Пусть

if my phone UI layout contains one-view pager and 

tablet UI layout contain two-view pager . 

Как мы можем достичь этого ?? В этой статье говорится, что вы создаете разные макеты с тем же именем для разных экранов и сохраняете соответствующую папку. Но я сомневаюсь, что это приведет к исключениям, если он попытается инициализировать компонент виджета макета планшета, когда приложение работает в телефоне.

EDIT 2: Идея, на мой взгляд, определяет, какой тип устройства я использую, например, Tab или телефон.

Determine if the device is a smartphone or tablet?

Затем избежать инициализации виджетов, если приложение является телефон. Есть ли лучший способ, чем это?

EDIT 3: Моя поддержка приложений от 2,3 до более высоких версий

Если мои макеты для планшета имеет дополнительные виджеты по сравнению с телефона макете .Как двутавровой инициализации и использования. Надеюсь, все поняли мою потребность. Поэтому, пожалуйста, уточните мои сомнения.

+0

** Это означает, что мы можем использовать разные макеты для разных устройств. Это меня смущает. ** Что смущает вас? Я думаю, что вы уже провели множество исследований. –

+0

Я предпочитаю использовать макет/большой (для 5.1-7-дюймового устройства), макет/xlarge (для 10-дюймовых вкладок) и макет для мобильных телефонов. Мобильные макеты можно дополнительно определить с помощью layout/large-xhdpi или ldpi/mdpi/hdpi –

+0

@FahadIshaque Пожалуйста, проверьте мое редактирование – edwin

ответ

6

Когда я сталкиваюсь с проблемой, я создаю следующую структуру.

res/layout 
res/layout-sw600dp 

затем различать ценности и другие ресурсы,

res/values 
res/values-sw600dp 
res/values-sw720dp 

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

И этот подход решить мою проблему.

+0

Итак, вы говорите мне использовать два класса обработчика макета для одной функциональности – edwin

+0

Но эта функциональность будет отличаться, если разные экраны моего друга. Если функциональность такая же, то идите на фрагмент, он решит вашу проблему, но, хотя у меня проблема с дизайном экрана, отличным для телефона и планшета, я использую этот подход. –

+0

@edwin, еще не решена ваша проблема? –

1

findViewById вернет виджет в том случае, если он присутствует в макете, null в случае, если такого виджета нет. Поэтому, если он возвращает ненулевое значение, вы можете продолжить инициализацию.

+0

Может проверить мой EDIT2 – edwin

+0

Я видел, что они иногда делают это так: если вы знаете, что на определенном макете у вас больше виджетов, чем на другом макете, тогда вы можете просто проверить наличие одного виджета из этой «дополнительной» группы. Если findViewById дает не null, это означает, что у вас также будут все остальные дополнительные виджеты. –