2013-05-14 2 views
7

Je crée une application pour Android 4.0 et plus, et je veux atteindre ce comportement. Deux activités différentes auront deux icônes de lanceur lorsque l'appareil de l'utilisateur est un téléphone, et il ne sera qu'un (les activités seront constituées de fragments que je vais afficher sous forme d'onglets dans une activité principale) sur les tablettes. Je sais que l'on peut mettre en place plusieurs activités de lancement dans le manifeste, mais je pense que j'aurais peut-être besoin de quelque chose qui va déterminer cette opération pendant l'exécution (en code java).Deux activités lanceur sur le téléphone, un sur la tablette

Répondre

0

Vous aurez besoin de faire plusieurs apks, un pour les onglets et un pour les téléphones, la seule différence sera le fichier manifeste dans ces apks. Reste que tu peux gérer avec du code.

0

Pourquoi prendre tant de douleur? Il suffit de concevoir des applications distinctes pour le téléphone et la tablette (assurez-vous qu'ils ont le même nom de package). Multiple APKs est ce que vous devez rechercher:

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. 

Voici un lien: http://developer.android.com/google/play/publishing/multiple-apks.html

+0

je l'ai déjà commencé à développer mon application avec une seule APK pour les téléphones et les tablettes. Ma logique d'application de trou est basée sur cela. Maintenant, j'ai besoin d'ajouter une nouvelle activité, avec ce comportement. J'ai donc besoin de sth qui peut rendre mon activité - lanceur en code: s – Sandra

+0

utilisez un seul lanceur d'activité et dans onCreate avant setContent, vérifiez simplement s'il s'agit d'un téléphone ou d'une tablette (en calculant la taille de l'écran). Après cela, définissez le fichier XML souhaité comme contenu de l'activité. –

+0

Thx pour la suggestion, mais je l'utilise déjà dans mon application. Maintenant, j'ai besoin d'afficher un fragment comme un onglet sur les tablettes, et encapsulé dans l'activité du lanceur distinct sur les téléphones. Je pense qu'il doit y avoir un moyen de faire cela. – Sandra

12

Deux activités différentes auront deux icônes du lanceur lorsque le dispositif de l'utilisateur est un téléphone, et ce sera juste un (le les activités consisteront en fragments que je présenterai sous forme d'onglets dans une activité principale) sur des tablettes.

Il n'y a pas de concept dans Android de "téléphone" et "tablette". Je vais supposer que vous faites la distinction entre "téléphone" et "tablette" en termes de taille d'écran.

Si cela est vrai:

Étape # 1: Créez un fichier res/values/bools.xml et définir deux <bool> ressources, is_phone et is_tablet. Avez is_phone être true et is_tablet être false.

Étape # 2: Créer un fichier res/values-.../bools.xml, où ... est tout qualificatif que vous utilisez avec vos mises en page pour distinguer entre les « téléphones » et « comprimés » (par exemple, -large, -xlarge, -swNNNdp). Définissez les mêmes deux ressources <bool> là avec des valeurs opposées (c'est-à-dire, is_phone est false, is_tablet est true). Étape # 3: Ajoutez les deux activités à votre manifeste, chacune configurée pour le MAIN/LAUNCHER<intent-filter>. Sur celui que vous voulez utiliser sur un "téléphone", ajoutez android:enabled="@bool/is_phone" à l'élément <activity>. Sur celui que vous voulez utiliser sur une "tablette", ajoutez android:enabled="@bool/is_tablet" à l'élément <activity>. De cette façon, selon les mêmes règles que vous utilisez pour vos mises en page, vous aurez une activité de lancement différente.


Apparemment, cela ne fonctionne pas, même si je le jure. Une autre option consiste à avoir une seule activité comme MAIN/LAUNCHER. Avoir mis en place avec android:theme="@style/Theme.NoDisplay", donc il n'a pas d'interface utilisateur. Faites-vous la détermination, en Java, dans onCreate(), laquelle de vos «vraies» activités de point d'entrée est appropriée pour la taille d'écran donnée, en utilisant peut-être les mêmes ressources que j'ai citées plus haut.Avoir alors appeler startActivity() pour passer le contrôle à la bonne activité et appeler finish() sur lui-même (de sorte que l'utilisateur ne rencontre pas une activité invisible sur la pile BACK). Cette technique est également utilisée dans les cas où il n'y a aucun moyen de contrôler cela via le manifeste, comme "avons-nous Maps V1 ou non" où vous avez android:required="false" sur l'élément <uses-library>.

+0

Cela semble être une solution intéressante. Je ne connaissais pas l'attribut 'enabled' qui peut être configuré dans le manifeste pour les activités. Je vais certainement essayer cela. Merci! – Sandra

+0

Je l'ai fait comme suggéré, mais sth ne fonctionne pas pour moi. En raison du comportement mentionné ci-dessus que je veux atteindre, j'ai mis en place deux ressources dans les fichiers bools.xml (bools.xml dans res/values ​​et bools.xml dans res/values-sw600dp) => main_activity_enabled (true dans res/valeurs et true dans res/values-sw600dp), second_activity_enabled (true dans res/values ​​et false dans res/values-sw600dp). De cela, je devrais avoir uniquement MainActivity en tant que lanceur sur les tablettes, mais malgré cela, j'ai deux lanceurs: S – Sandra

+0

@Sandra: Vous devez 'main_activity_enabled' être faux dans l'un de vos cas - vous prétendez l'avoir être ' true' dans les deux. – CommonsWare

1

Le premier lancement de votre application, vous pouvez vérifier si votre programme appareil est une tablette ou un téléphone. S'il s'agit d'un téléphone, vous pouvez ajouter par programme un raccourci vers l'écran d'accueil et spécifier l'intention que le lanceur doit utiliser pour accéder à l'activité correcte. Tout d'abord, dans votre manifeste, vous ne disposerez que d'un seul lanceur, mais vous disposerez d'un filtre Activité sans intention qui sera ouvert à partir du raccourci créé par programmation.

Ensuite, dans l'onglet OnCreate de votre activité Lanceur, vérifiez si vous avez déjà créé le raccourci. D'après ce que j'ai lu, la meilleure façon de faire est d'utiliser une valeur booléenne dans 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); 
     } 
    } 
} 

Ensuite, vous devez définir ce que vous appelez une tablette. Ceci est basé sur les pixels indépendants de la densité de l'écran. Par exemple, pour appeler les appareils avec des comprimés écrans 7 pouces, ce nombre est 600. Pour les appareils plus grands - comme un écran de 10 pouces, ce nombre est 720. magasin ce numéro dans une variable:

private static final int TABLET_DP = 600; 

Ensuite, ajouter les méthodes utilisées ci-dessus:

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); 
} 

Enfin, assurez-vous d'avoir les autorisations nécessaires pour installer des raccourcis:

<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"></uses-permission> 
Questions connexes