63 votes

Cliquable widgets android

La documentation pour les développeurs a semblait avoir échoué ici, avec moi. Je peux créer un statique widget sans réfléchir, je peux même créer un widget comme l'analogue d'horloge widget qui permettra de mettre à jour lui-même, cependant, je ne peux pas pour la vie de me comprendre comment créer un widget qui réagit lorsqu'un utilisateur clique dessus. Ici est le meilleur exemple de code que le développeur de la documentation donne à ce qu'un widget de l'activité doit contenir (le seul autre indice étant l'API démos, ce qui crée une statique widget):

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

à partir de: L'Android Developer Documentation du Widget de la Page

Ainsi, il ressemble à l'attente de l'intention est appelée lorsque le widget est cliqué, qui est basé sur une intention (je ne suis pas sûr que la différence entre une intention et une attente de l'intention de l'est), et l'objectif est de l'ExampleActivity classe. J'ai donc fait mon exemple d'activité de la classe d'une activité simple qui lors de sa création, serait de créer un mediaplayer objet, et de le démarrer (il ne serait pas jamais lâcher l'objet, de sorte qu'il finirait par crash, voici son code:

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

Cependant, quand j'ai ajouté le widget à l'écran d'accueil, et cliqué sur elle, rien joué, en fait, rien de joué lorsque j'ai mis la mise à jour de la minuterie à seulement quelques centaines de millisecondes (dans l'appwidget fournisseur de fichier xml). En outre, j'ai mis des points de rupture et a découvert que non seulement il n'atteignant jamais l'activité, mais pas de rupture de points que j'ai mis n'est déclenchée. (Je n'ai toujours pas compris pourquoi), cependant, logcat semble indiquer que l'activité de la classe fichier est en cours d'exécution.

Donc, est-ce que je peux faire pour obtenir un appwidget pour répondre à un clic? Comme le onClickPendingIntent() la méthode est le plus proche que j'ai trouvé pour un onClick type de méthode.

Je vous remercie beaucoup.

129voto

strange quark Points 2947

Tout 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'instance d'intention:

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

(Où widget.class c'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);

Définir la onClickPendingIntent pour la cliquables vue dans votre widget

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

Ensuite, remplacer la méthode onReceive dans la même catégorie:

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

Et puis répondre à votre appuie sur un bouton en interrogeant l'intention retourné pour votre action au sein de la méthode onReceive:

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

Et cela devrait le faire!

1voto

Fedor Points 29890

Vous pouvez prendre un coup d'oeil à Wikitionary de l'échantillon dans le SDK pour voir comment ils traitent cliquez sur. Ils font la même chose que vous et il fonctionne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X