[android] AppWidget onClick時にIDを渡す
前回はViewのonClickリスナにPendingIntentを仕掛けることによって、AppWidgetのクリックイベントを拾うことができました。
複数のWidgetを配置している場合には、どのWidgetがクリックされたかを判断する必要があります。
Intent.setData()を使用してActivityにAppWidgetIDを渡してあげればOKです。
public class SampleWidgetProvider extends AppWidgetProvider {
public static final Uri CONTENT_URI = Uri.parse("content://jp.xfutures.android.sample");
public void onUpdate(
Context context,
AppWidgetManager appWidgetManager,
int[] appWidgetIds
){
for(int id : appWidgetIds){
// 起動するActivityのIntentを作成する
Intent intent = new Intent(context, SampleWidgetActivity.class);
// AppWidget IDを設定する
Uri uri = ContentUris.withAppendedId(CONTENT_URI, id);
intent.setData(uri);
// PendingIntentを取得する
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
// onClickリスナを設定する
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.main);
views.setOnClickPendingIntent(R.id.TextView01, pendingIntent);
// AppWidgetを更新する
appWidgetManager.updateAppWidget(id, views);
}
}
}
受けるとる時はIntent.getData()ですね。
public class SampleWidgetActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.onclick);
// AppWidget IDを取得する
Uri uri = getIntent().getData();
int id = (int)ContentUris.parseId(uri);
// AppWidget IDをTextViewに設定する
TextView view = (TextView)findViewById(R.id.TextViewID);
view.setText(String.format("WidgetID is %d.", id));
}
}

