2010-05-01 8 views
59

La documentation du développeur semble avoir échoué ici. Je peux créer un widget statique sans réfléchir, je peux même créer un widget comme le widget horloge analogique qui se mettra à jour, cependant, je ne peux pas pour la vie de moi comprendre comment créer un widget qui réagit quand un utilisateur clique sur il. Voici le meilleur exemple de code que la documentation développeur donne à ce qu'une activité widget doit contenir (le seul autre indice étant les démos de l'API, ce qui crée seulement un widget statique):Widgets cliquables dans android

public class ExampleAppWidgetProvider extends AppWidgetProvider { 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
     final int N = appWidgetIds.length; 

     // Perform this loop procedure for each App Widget that belongs to this provider 
     for (int i=0; i<N; i++) { 
      int appWidgetId = appWidgetIds[i]; 

      // Create an Intent to launch ExampleActivity 
      Intent intent = new Intent(context, ExampleActivity.class); 
      PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0); 

      // Get the layout for the App Widget and attach an on-click listener to the button 
      RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_provider_layout); 
      views.setOnClickPendingIntent(R.id.button, pendingIntent); 

      // Tell the AppWidgetManager to perform an update on the current App Widget 
      appWidgetManager.updateAppWidget(appWidgetId, views); 
     } 
    } 
} 

de: The Android Developer Documentation's Widget Page

Ainsi, il semble que l'intention en attente soit appelée lorsque le widget est cliqué, ce qui est basé sur une intention (je ne suis pas sûr de la différence entre une intention et une intention en attente) et l'intention est pour la classe ExampleActivity . Donc, j'ai fait ma classe d'activité exemple une activité simple qui lors de sa création, créerait un objet MediaPlayer, et commencer (il ne jamais libérer l'objet, il finirait par tomber en panne, voici son code:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    MediaPlayer mp = MediaPlayer.create(getApplicationContext(), R.raw.sound); 
    mp.start(); 
} 

Cependant, lorsque j'ai ajouté le widget à l'écran d'accueil et que j'ai cliqué dessus, rien n'a joué, en fait, rien n'a été joué lorsque j'ai réglé la minuterie de mise à jour à quelques centaines de millisecondes. mettre en place des points de rupture et découvert que non seulement il n'atteignait jamais l'activité, mais aucun point de rupture que je définissais ne serait jamais déclenché (je n'ai toujours pas compris pourquoi), cependant, logcat semblait indiquer que la classe d'activité le fichier était en cours d'exécution

Alors, y a-t-il quelque chose que je puisse faire pour obtenir un appwidget pour répondre à un clic? Comme la méthode onClickPendingIntent() est le plus proche d'un type de méthode onClick.

Merci beaucoup.

+0

Hai Leif, résolvez-vous ce problème par la méthode de Brain515? J'ai un problème similaire, mais la solution du cerveau ne fonctionne pas pour moi, pouvez-vous s'il vous plaît m'aider? –

Répondre

124

D'abord, ajoutez une variable statique avec une constante.

public static String YOUR_AWESOME_ACTION = "YourAwesomeAction"; 

Ensuite, vous devez ajouter l'action à l'intention avant d'ajouter l'intention de l'intention dans l'attente:

Intent intent = new Intent(context, widget.class); 
intent.setAction(YOUR_AWESOME_ACTION); 

(Où widget.class est la classe de votre AppWidgetProvider, votre classe actuelle)

Vous devez ensuite créer un PendingIntent avec getBroadcast

PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0); 

Réglez le onClickPendingIntent pour la vue cliquable dans votre widget

remoteView.setOnClickPendingIntent(R.id.widgetFrameLayout, pendingIntent); 

Ensuite, remplacer la méthode OnReceive dans la même classe:

@Override 
public void onReceive(Context context, Intent intent) { 
super.onReceive(context, intent); 

et de répondre ensuite à vos presses bouton en interrogeant l'intention retourné pour votre action dans la méthode onReceive:

if (intent.getAction().equals(YOUR_AWESOME_ACTION)) { 
    //do some really cool stuff here 
} 

Et cela devrait le faire!

+1

où cette ligne (Intention intention = new Intent (context, ExampleActivity.class); Qu'est-ce que le widget.classe contient? Je suppose que ExampleActivity est ce que nous voulons lancer – JustCurious

+1

Édité la réponse à une méthode quelques étapes supplémentaires qui sont nécessaires pour que cela fonctionne. GetBroadcast est important pour que PendingIntent soit diffusé plutôt que getActivity à partir de l'exemple. – Guykun

+0

Pourquoi PendingIntent.getBroadcast vs PendingIntent.getActivity? –

Questions connexes