2011-05-16 1 views
7

J'ai créé un AppWidget pour Honeycomb qui fonctionne bien, sauf que lorsqu'il est installé pour la première fois, il n'apparaît pas dans le menu Widgets, donc il ne peut pas être ajouté à un écran d'accueil. Le redémarrage de l'appareil lui permettra de s'afficher, ou pendant le développement, l'envoyer deux fois à partir d'Eclipse le fera apparaître.Android AppWidget n'apparaît pas dans le menu en nid d'abeille avant le redémarrage

Des idées?

Merci!

+0

Qu'avez-vous défini comme installLocation dans le manifeste? – EboMike

+0

Je ne l'avais pas réglé, mais après quelques recherches, j'ai ajouté internalOnlt. Même résultat :( – FloatingCoder

+0

(je voulais dire internalOnly) – FloatingCoder

Répondre

9

Apparemment, EboMike avait raison, la configuration android: installLocation = "internalOnly" a résolu le problème. Sans spécifier un emplacement d'installation, il aurait dû être par défaut internalOnly, mais cela ne me semblait pas le cas. Peut-être que quelque chose a changé dans Honeycomb? En outre, même avec internalOnly, je voyais toujours le problème lors de l'installation à partir d'Eclipse (le widget ne s'afficherait pas dans le menu de sélection jusqu'à la deuxième exécution) mais lors de l'installation sur le marché Android, il semble fonctionner correctement ce qui était ma principale préoccupation.

Merci!

+0

L'emplacement d'installation peut être difficile, si c'est sur la carte SD, le widget refusera d'apparaître jusqu'à ce que vous le déplaciez dans le stockage interne et réinitialiser votre téléphone. l'emplacement serait par défaut "interne seulement", mais peut-être que Honeycomb a changé les choses ... Eh bien, tant que ça fonctionne maintenant ... – EboMike

1

Spooky,

Je l'ai fait ce correctif installLocation et cela a fonctionné première fois.

Mais à partir de là, je dois toujours redémarrer chaque fois que je mets à jour mon widget sur ma Xoom avec 3.01 pour le voir dans la liste.

4

La raison en est en fait décrite here et il est à la conception à partir d'Android 3.1. Par défaut, installLocation sera déjà défini sur "internalOnly", ce qui ne devrait pas résoudre le problème et ne devrait pas non plus être réinitialisé. Pour contourner ce problème, une activité doit être déclenchée dans votre widget. Cela l'activera et apparaîtra dans la liste des widgets.

Pour ce faire, vous pouvez ajouter une activité qui fait essentiellement rien comme ceci:

1) Dans votre AndroidManifest.xml, ajoutez dans votre balise "application":

<activity 
    android:name=".DummyActivity" 
    android:label="@string/app_name"> 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 
</activity> 

2) ensuite, créez une classe « DummyActivity.java » dans votre « src » comme ceci:

package com.domain.app; 
import android.app.Activity; 
import android.os.Bundle; 
public class DummyActivity extends Activity 
{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     finish(); 
    } 
} 

maintenant, lorsque vous déployez le widget sur votre appareil, cette activité sera lancée automatiquement (vous me voyez un ssage dans votre console Eclipse en disant "start activity ...") et il "terminera" immédiatement sans rien afficher de visuel sur l'appareil. Et maintenant votre widget sera listé dans la liste des widgets!

0

Pour résoudre ce problème avec mon widget I envoyer une diffusion de mise à jour un widget, comme dans mes WidgetController.class:

Intent intent = new Intent(); 
intent.setClassName(context, context.getPackageName() + ".WidgetProvider"); 
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); 
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, 
     getWidgetIds(context)); 
context.sendBroadcast(intent); 

puis pour fournir initialisation widget stable dans le système que j'envoie cette émission d'objet Application lorsque l'application ou le début de widget:

public class MyApp extends Application { 

    @Override 
    public void onCreate() { 

     WidgetController.getInstance().updateWidget(getApplicationContext()); 
    } 
} 

!!! Important: lorsque AppWidget héberge dans l'application, c'est suffisant, mais lorsque AppWidget est séparé de celui-ci, vous devriez utiliser la méthode proposée par @John ci-dessus dans cette rubrique.

Questions connexes