web-dev-qa-db-fra.com

Commencez l'activité en cliquant sur le widget

Je suis novice en programmation Android et j'essaie de créer un widget qui a pu obtenir des données du FAI sur mon compte. Il y a beaucoup de choses inconnues sur la façon de le faire, mais je l'ai fait quelques petites choses - J'ai un widget avec une activité de configuration, où l'utilisateur doit taper son identifiant et son mot de passe. Le widget stocke les données dans SharedPerferences, et quand il est temps de mettre à jour le widget, j'utilise un service pour démarrer une données de compte. Maintenant, je veux commencer une activité en cliquant sur le widget. J'ai essayé tous les conseils que j'ai trouvés sur ce site et le widget ne peut pas démarrer l'activité. Mon widget basé sur un autre widget qui a placé ici https : //github.com/Arturus/MetrikaWidget . Je ne comprends pas quoi et où je dois changer pour commencer l'activité en cliquant sur mon widget. Merci.

MISE À JOUR: Ma fonction de mise à jour, où je suggère de placer PendingIntent

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
{
    Log.d(TAG, "onUpdate");

    for (int appWidgetId : appWidgetIds)
    {
        updateAppWidget(context, appWidgetManager, appWidgetId);
    }

    /* An updateAppWidget functions looks like as:

    Intent intent = new Intent(context, UpdateWidgetService.class);
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
    context.startService(intent);
    */

    Intent intent = new Intent(context, DetailedStatActivity.class);
    PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0);

    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.layout);

    views.setOnClickPendingIntent(R.id.layout, pendingIntent);

    ComponentName componentName = new ComponentName(context.getPackageName(), WidgetProvider.class.getName());

    appWidgetManager.updateAppWidget(componentName, views);
}
22
Nova

Utilisez cet extrait dans la méthode onUpdate() de votre widget AppWidgetProvider classe:

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widgetlayout);
    Intent configIntent = new Intent(context, Activity.class);

    PendingIntent configPendingIntent = PendingIntent.getActivity(context, 0, configIntent, 0);

    remoteViews.setOnClickPendingIntent(R.id.widget, configPendingIntent);
    appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);
}     

Ici widgetlayout est le nom de la disposition de votre widget et R.id.widget est son ID de disposition parent.

Modifier :
Maintenant, je vois votre code que vous avez ajouté à votre question. Vous devriez faire:

PendingIntent.getActivity(context, 0, configIntent, 0);

(l'activité de ce début) au lieu de

PendingIntent.getService(...);

cette tentative de démarrage du service. Bonne chance.

Références:
doityourselfandroid.com

helloandroid.com

57
hasanghaforian
Intent inet = new Intent(your_action);
inet.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pIntentNetworkInfo = PendingIntent.getActivity(context, 2, 
            inet, Intent.FLAG_ACTIVITY_NEW_TASK);
remoteViews.setOnClickPendingIntent(you_component_when_the_user_pressing_this_activity_should_start, pIntentNetworkInfo);
9
Kamalone

Je ne sais pas "Créer un widget à partir d'un autre widget". Ceci est hors de ma connaissance mais je vous suggère de créer votre propre widget.

En dehors de cela, l'appel d'activité depuis un widget doit utiliser PendingIntent

Voici un exemple simple pour le faire

Intent iSetting = new Intent(this, MyConfig.class);
PendingIntent piSetting = PendingIntent.getActivity(this, 0, iSetting, 0);
views.setOnClickPendingIntent(R.id.IdComponent, piSetting);

Ou vous devrez peut-être voir ce lien et ce lien

2
stuckedoverflow