2013-05-21 16 views
10

Voglio sviluppare un'applicazione universale. Sono un principiante di questo approccio. Questo significa un singolo apk per l'applicazione sia per tablet che per telefono. Ho dovuto passare attraversoApp universale per Android Approccio

Support Library

Fragments

Il mio obiettivo è quello di costruire diversa interfaccia utente per tablet e telefono all'interno di un unico apk.

Avevo letto Getting Your App Ready for Jelly Bean and Nexus 7. Questo articolo menziona che

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 

Ciò significa che è possibile utilizzare layout diversi per dispositivi diversi. Questo mi confonde

EDIT 1 :: Scenario

Supponiamo

if my phone UI layout contains one-view pager and 

tablet UI layout contain two-view pager . 

Come possiamo raggiungere questo ?? In questo articolo si dice che si progetta un layout diverso con lo stesso nome per lo schermo diverso e si mantiene la cartella corrispondente. Ma il mio dubbio creerà delle eccezioni se tenterà di inizializzare il componente widget del layout Tablet quando l'app è in esecuzione in un telefono.

MODIFICA 2: L'idea mi è venuta in mente è determinare quale tipo di dispositivo sto usando, cioè Tab o telefono.

Determine if the device is a smartphone or tablet?

Poi evitare l'inizializzazione di widget se app è telefono. C'è un modo migliore di questo?

EDIT 3: mio supporto per le applicazioni da 2,3 a versioni superiori

Se i miei layout per tablet tiene widget aggiuntivi rispetto ai Componenti del telefono .Come un inizializzo e l'uso. Spero che tutti abbiano compreso il mio bisogno. Quindi, per favore chiarisci il mio dubbio

+0

** Ciò significa che possiamo utilizzare layout diversi per dispositivi diversi. Questo mi confonde. ** Cosa ti confonde? Penso che tu abbia già fatto un sacco di ricerche. –

+0

Preferibilmente uso layout/grande (per dispositivo da 5,1 pollici), layout/xlarge (per schede da 10 pollici) e layout normale per cellulari. I layout mobili possono essere ulteriormente definiti usando layout/large-xhdpi o ldpi/mdpi/hdpi –

+0

@FahadIshaque Si prega di controllare la mia modifica – edwin

risposta

6

Quando affronto il problema, creo la seguente struttura.

res/layout 
res/layout-sw600dp 

poi a distinguere i valori e le altre risorse,

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

notato che v'è solo un layout directory e due valori directory per specificare i margini e padding e altre risorse. Quindi il layout singolo può essere utilizzato per tablet da 7 "e da 10". Questo è il mio scenario, puoi anche definire layout-sw720dp. L'ho fatto a causa della riduzione dei tempi di compilazione dei layout.

Ho anche diversi layout in telefono e tablet.Ad esempio, ho un ListView nella prima schermata, quindi quando l'utente fa clic sull'elemento, si aprirà un'altra attività e c'è DetailView per quello. Ma nel tablet, ho lasciato il lato ListView e il lato destro DetailView.

Quindi, per farlo, in valori/stringhe, ho posto seguente codice,

<bool name="isTablet">false</bool> 

e stesse per tablet valori-sw600dp/stringhe

<bool name="isTablet">true</bool> 

ora, vengono a parte della codifica. Ho una schermata iniziale e che ha un layout comune. Quindi mostrerà lo schermo comune. Ma quando l'utente fa clic su qualsiasi pulsante, controllerà se è tablet oppure no. Per controllare ciò,

boolean isTablet = getResources().getBoolean(R.bool.isTablet); 

Ora avete bandiera indicare se l'applicazione è in esecuzione sul telefono o tablet.

ho creato due pacchetti,

com.phone 
com.tablet 

poi come per bandiera, ho diretto la mia attività di telefono pacchetto e tablet pacchetto.

Esempio,

if(isTablet) 
    startActivity(this,TabXYZ.class); 
else 
    startActivity(this,PhXYZ.class); 

e questo approccio ha risolto il mio problema.

+0

Quindi mi stai dicendo di usare due classi di gestione layout per una funzionalità – edwin

+0

Ma quella funzionalità sarà diversa se le schermate sono diverse amico mio. Se la funzionalità è la stessa, quindi vai per il frammento, risolverà il tuo problema, ma anche se ho problemi con lo schermo diverso per telefono e tablet, io uso questo approccio. –

+0

@edwin, il problema non è ancora risolto? –

1

findViewById restituirà il widget nel caso sia presente nel layout, null nel caso in cui non ci sia tale widget. Quindi se ritorna non nullo puoi procedere con l'ulteriore inizializzazione.

+0

Posso controllare il mio EDIT2 – edwin

+0

Ho visto che a volte fanno così: se lo sapete su un determinato layout hai più widget che su un altro layout, quindi puoi semplicemente verificare la presenza di un singolo widget da quel gruppo 'extra'. Se findViewById fornisce valori non nulli significa che avrai anche tutti gli altri widget extra. –

Problemi correlati