2011-01-28 10 views
2

これは非常にシンプルなので、申し訳ありませんがアンドロイドプログラミングに関する私の足を濡らしています。クリックしたテキストビューに応じてアプリウィジェットからアクティビティにデータを渡す

私のアプリウィジェットは、いくつかの動的に追加されたテキストビューで構成されています。それぞれのテキストビューは、どちらがクリックされたかに基づいて変化するインデックスで同じアクティビティを起動します。正しいインデックスを取得することは、私が現在問題を抱えていることです。以下は

は、私はウィジェットを作成するために使用するコードです:

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

何が起こることは私はをクリックして1に関係なく常に得るある現在:

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

そしてここでは、アクティビティコードがあります私は常に最初のものをクリックしていることを意味する "1"ポップアップ、または間違ったデータが通過していることを意味します。

私はこの場所を見渡しましたが、一般的な「データの受け渡し方法」タイプのチュートリアル/問題以外の情報は見つかりませんでした。

答えて

1

私は、あなたがPendingIntentの「トラップ」のために落ちていると思います。デフォルトではクリアされていません。あなたはそうするための旗を与える必要があります。私のブログ記事をチェックしてください:http://javablogs.com/Jump.action?id=628173

+0

お返事ありがとうございます。私はPendingIntent.FLAG_CANCEL_CURRENTを使用してみました(そしてPendingIntent.FLAG_ONE_SHOTも)、しかし今、何が起こるかは、私の操作が最初に呼び出されるだけです。ウィジェットは何も起こらないように見える。 –

+0

私はまた、最後のテキストビューだけがアクションを開始し、他のものは何もしないように見えることに気付きました。 –

+0

Androidには「最後のものが勝つ」場所がたくさんあるようです。たとえば、inClick(){startActivity(X);} startActivity(Y); }私はYが呼び出される(iirc) –

0

これを試してください。それはだったので、本当に私の問題を解決し、ジョージ・ダケットが別々の回答記入に値する@によって意図

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

コメントにデータを追加します。

私は私の問題を解決しました。同じアクションのいくつかの保留中のインテントがある場合は、直近のインテントを効果的に無視して最新のものを取得します。解決策は、PendingIntent.getActivityメソッドの 'requestCode'パラメータとして一意の識別子を渡すことです。

私は同様の問題で同様のコードを持っていました。また、目的にエキストラを入れて、後でpendingIntentを作成しました:

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

PendingIntent.FLAG_UPDATE_CURRENTの使用を代わりに0の良かったと確保し、放送は、我々はgetIntExtraのような「エクストラ」から取得することができ、正しいデータで新鮮な意図をrecieves。

0requestCodeに使用すると、問題が発生します。私がTextView要素の中でユニークな値に変更した後では、タッチされた異なるテキストビューに対して異なるデータを得ることができました。私の要素は通知を表示するので、は自然なフィット感でした:

int notificationId = reminder.notificationId /* specific to my application, 
              find something for yours! */; 
PendingIntent pendingIntent = PendingIntent.getBroadcast(
    context, notificationId, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
関連する問題