Sto creando un'applicazione per Android 4.0+ e desidero ottenere questo comportamento. Due attività diverse avranno due icone di avvio quando il dispositivo dell'utente è un telefono e sarà solo una (le attività saranno costituite da frammenti che visualizzerò come schede in un'unica attività principale) sui dispositivi tablet. So che uno può impostare più attività di avvio nel manifest, ma penso che forse avrei bisogno di qualcosa che determinerà questa operazione durante il runtime (nel codice java).Due attività di avvio sul telefono, una sul tablet
risposta
Avrete bisogno di fare più apk, uno per le schede e uno per i telefoni, l'unica differenza sarà il file manifest in quegli apk. Resto puoi gestire con il codice.
Perché prendere così tanto dolore? Basta progettare app separate per telefono e tablet (assicurati che abbiano lo stesso nome del pacchetto). Multiple APKs
è ciò che si dovrebbe cercare:
Although we encourage you to develop and publish a single APK that supports as many device
configurations as possible, doing so is sometimes not possible. To help you publish your
application for as many devices as possible, Google Play allows you to publish multiple
APKs under the same application listing. Google Play then supplies each APK to the
appropriate devices based on configuration support you've declared in the manifest file of
each APK.
Ecco un link: http://developer.android.com/google/play/publishing/multiple-apks.html
due diverse attività avranno due launcher icone quando il dispositivo dell'utente è un telefono, e sarà solo uno (il le attività saranno costituite da frammenti che mostrerò come schede in un'unica attività principale) su dispositivi tablet.
Non c'è alcun concetto in Android di "telefono" e "tablet". Presumo che tu stia distinguendo tra "telefono" e "tablet" in termini di dimensioni dello schermo.
Se questo è vero:
Passo # 1: Creare un file res/values/bools.xml
e definire due <bool>
risorse, is_phone
e is_tablet
. Sono is_phone
essere true
e is_tablet
essere false
.
Passo # 2: Creare un file res/values-.../bools.xml
, dove ...
è tutto ciò di qualificazione che si sta utilizzando con i layout di distinguere tra "telefoni" e "tablet" (ad esempio, -large
, -xlarge
, -swNNNdp
). Definire le stesse due risorse <bool>
con valori opposti (ad esempio, is_phone
è false
, is_tablet
è true
).
Passaggio n. 3: aggiungere entrambe le attività al file manifest, ciascuna impostata per il MAIN
/LAUNCHER
<intent-filter>
. Su quello che si desidera utilizzare su un "telefono", aggiungere android:enabled="@bool/is_phone"
all'elemento <activity>
. Su quello che si desidera utilizzare su un "tablet", aggiungere android:enabled="@bool/is_tablet"
all'elemento <activity>
.
In questo modo, in base alle stesse regole che si stanno utilizzando per i propri layout, si avrà una diversa attività di avvio.
Apparentemente, questo non funziona, anche se giuro che era abituato.
Un'altra opzione è che una singola attività sia la MAIN
/LAUNCHER
. Avere impostato con android:theme="@style/Theme.NoDisplay"
, quindi non ha un'interfaccia utente. È necessario determinare, in Java, in onCreate()
, quale delle attività "reali" del punto di ingresso è appropriata per la dimensione dello schermo specificata, magari utilizzando le stesse risorse bool
citate sopra.Chiamare quindi startActivity()
per passare il controllo all'attività giusta e chiamare finish()
su se stesso (in modo che l'utente non incontri un'attività invisibile nello stack BACK). Questa tecnica viene anche utilizzata nei casi in cui non è possibile controllare questo tramite il manifest, ad esempio "disponiamo di Maps V1 o no" dove è disponibile l'elemento <uses-library>
nell'elemento <uses-library>
.
Sembra una soluzione interessante. Non sapevo dell'attributo 'enabled' che può essere impostato nel manifest per le attività. Sicuramente lo proverò. Grazie! – Sandra
Ho fatto come hai suggerito, ma sth non sta funzionando per me. A causa del comportamento sopra menzionato che voglio raggiungere, ho impostato due risorse
@Sandra: In uno dei tuoi casi è necessario 'main_activity_enabled' essere' false' - affermi di averlo essere ' vero? in entrambi. – CommonsWare
È possibile che io stia battendo un cavallo morto, ma per quanto riguarda l'utilizzo degli alias di layout?
al primo avvio dell'applicazione, è possibile a livello di codice controllare se il vostro dispositivo è un tablet o un telefono. Se si tratta di un telefono, è possibile aggiungere a livello di programmazione un collegamento alla schermata iniziale e specificare l'intenzione che deve essere utilizzata dal programma di avvio per accedere all'attività corretta.
Per prima cosa, nel tuo Manifest, avrai un solo launcher, ma avrai un'attività senza filtri intent che verrà aperta dal collegamento creato a livello di programmazione.
Quindi, nel tuo Activity Activity onCreate, controlla se hai già creato il collegamento. Da quello che ho letto, il modo migliore per farlo è usare un valore booleano in SharedPreferences
:
SharedPreferences prefs = getSharedPreferences(getPackageName(), MODE_PRIVATE);
if (!prefs.getBoolean("shortcut", false)) {
if (!isTablet(this)) {
createShortcut();
}
prefs.edit().putBoolean("shortcut", true).commit();
}
else {
//if the shortcut has already been made, see if that is what was used to open this app
if (getIntent() != null) {
if (getIntent().getBooleanExtra("shortcut", false)) {
//the shortcut was used, so open the other Activity:
Intent shortcut = new Intent(this, OtherActivity.class);
startActivity(shortcut);
}
}
}
Successivamente, è necessario definire quello che si chiama un tablet. Questo si basa sui pixel indipendenti dalla densità dello schermo. Ad esempio, per richiamare dispositivi con schermi 7 pollici compresse, questo numero è 600. Per i dispositivi più grandi - come uno schermo da 10 pollici, questo numero è 720. Conservare il numero in una variabile:
private static final int TABLET_DP = 600;
Poi aggiungere i metodi utilizzati in precedenza:
public static boolean isTablet(Context context) {
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);\
Display display = wm.getDefaultDisplay();
DisplayMetrics outMetrics = new DisplayMetrics();
display.getMetrics(outMetrics);
float density = context.getResources().getDisplayMetrics().density;
float dpWidth = outMetrics.widthPixels/density;
return dpWidth >= TABLET_DP;
}
private void createShortcut() {
//this is the intent that will be used when the shortcut is clicked.
Intent shortcutIntent = new Intent(Intent.ACTION_MAIN);
shortcutIntent.setClassName(this, this.getClass().getName());
shortcutIntent.putExtra("shortcut", true);
//this is the intent used to create the shortcut.
Intent intent = new Intent();
intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.app_name));//or however you want the shortcut to be labeled.
Parcelable iconResource = Intent.ShortcutIconResource.fromContext(
this, R.drawable.ic_launcher);//or whatever you want the icon to be
intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconResource);
intent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
//tell Android to create the shortcut
context.sendBroadcast(intent);
}
Infine, essere sicuri di avere le autorizzazioni necessarie per installare le scorciatoie:
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"></uses-permission>
ho già iniziato a sviluppare la mia applicazione con un solo apk per entrambi i telefoni e tablet. La mia logica di applicazione del buco è basata su questo. Ora ho bisogno di aggiungere nuove attività, con questo comportamento. Quindi ho bisogno di sth che possa rendere la mia attività - l'attività di avvio nel codice: s – Sandra
usa solo un attivatore di attività e su onCreate prima di setContent, controlla solo se il dispositivo è un telefono o un tablet (calcolando le dimensioni dello schermo). Successivamente, imposta l'xml desiderato come contenuto per l'attività. –
Thx per il suggerimento, ma lo sto già usando nella mia applicazione. Ora ho bisogno di visualizzare un frammento come una scheda su tablet e incapsulato in attività di avvio separate sui telefoni. Penso che ci debba essere un modo per farlo. – Sandra