2011-01-28 1 views
2

Je commence à me mouiller les pieds en ce qui concerne la programmation Android, donc je suis désolé si c'est très simple.Transmettre les données du widget de l'application à l'activité en fonction du texte cliqué

Mon widget d'application est constitué de plusieurs textviews ajoutés dynamiquement, chacun lancant la même activité avec un index variable basé sur celui sur lequel on a cliqué. Obtenir l'index correct est ce que j'ai des problèmes avec actuellement.

Voici le code que j'utilise pour créer le widget:

public static String ListItemIndex = "com.georgeduckett.helloworld.ScrollWidgetProvider.ListItemIndex"; 

@Override 
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]; 


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

     // Create several views that will contain the content 
     for (int newviewindex = 1; newviewindex<5; newviewindex++) { 
      // Create an Intent to launch WidgetActivity for when we're clicked on 
      Intent intent = new Intent(context, WidgetActivity.class); 
      Bundle bundle = new Bundle(); 

      bundle.putInt(com.georgeduckett.helloworld.ScrollWidgetProvider.ListItemIndex, newviewindex); 
      intent.putExtras(bundle); 
      intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0); 

      RemoteViews SubItemView = new RemoteViews(context.getPackageName(), R.layout.scroll_widget_item_layout); 
      SubItemView.setTextViewText(R.id.textbox1, "testing " + newviewindex); 
      SubItemView.setOnClickPendingIntent(R.id.textbox1, pendingIntent); 
      views.addView(R.id.items_container, SubItemView); 
     } 

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

Et voici le code d'activité:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    Bundle bundle = getIntent().getExtras(); 

    if(bundle != null) { 
     int Index = bundle.getInt(com.georgeduckett.helloworld.ScrollWidgetProvider.ListItemIndex); 
     Toast.makeText(this, Integer.toString(Index), Toast.LENGTH_LONG).show(); 
    } 
    else 
    { 
     Toast.makeText(this, "Boo!", Toast.LENGTH_LONG).show(); 
    } 

    setContentView(R.layout.main); 
} 

Actuellement ce qui se passe est peu importe qui je clique sur i toujours obtenir Popup '1', ce qui implique que je suis toujours en cliquant sur le premier, ou cela implique que les données erronées sont transmises.

J'ai regardé partout pour celui-ci, mais je ne trouve aucune information autre qu'un tutoriel de type générique 'comment transmettre des données'.

Répondre

1

Je pense que vous tombez pour un piège dans PendingIntent - il n'est pas effacé par défaut. Vous devez lui donner un drapeau pour le faire. Vérifiez mon blog à ce sujet: http://javablogs.com/Jump.action?id=628173

+0

Merci pour une réponse rapide. J'ai essayé d'utiliser le PendingIntent.FLAG_CANCEL_CURRENT comme vous l'avez suggéré (et aussi PendingIntent.FLAG_ONE_SHOT), cependant, maintenant, ce qui se passe, c'est que mon action n'est appelée que la première fois, une fois que je la rejette (cliquez sur le bouton précédent) le widget rien ne semble arriver. –

+0

J'ai aussi remarqué que seul le dernier textview démarre l'action, les autres semblent ne rien faire. –

+0

On dirait qu'il y a plus d'endroits dans Android, où "le dernier gagne". Si vous faites par exempledans onClick() {startActivity (X); startActivity (Y); } Seulement Y sera appelé (iirc) –

0

Essayez ceci. Ajouter des données à l'intention

intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME))); 
1

Le commentaire par @ george-Duckett mérite une entrée séparée de réponse, car il était, ce qui est vraiment résolu mon problème.

J'ai trouvé une solution à mon problème. Il semble que si j'ai plusieurs intentions en suspens pour la même action, elle sera juste la plus récente, ignorant les précédentes. La solution consiste à transmettre un identifiant unique en tant que paramètre 'requestCode' de la méthode PendingIntent.getActivity.

J'ai eu un code similaire avec un problème similaire. Il a également mis extras dans l'intention et plus tard a créé un pendingIntent:

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

L'utilisation de PendingIntent.FLAG_UPDATE_CURRENT au lieu de 0 était bon et assuré, l'émission reçoit une intention nouvelle avec des données correctes, nous pouvons obtenir de « extra » comme getIntExtra.

En utilisant 0 pour requestCode causé cependant des problèmes. Seulement après que je l'ai changé à une valeur, unique à travers mes éléments TextView, j'ai été en mesure d'obtenir des données différentes pour différentes vues de texte touchées. Mes éléments montrent la notification, de sorte que le notificationId était un ajustement naturel:

int notificationId = reminder.notificationId /* specific to my application, 
              find something for yours! */; 
PendingIntent pendingIntent = PendingIntent.getBroadcast(
    context, notificationId, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
Questions connexes