この質問はAndroid - Multiple appWidgets playing different soundのほぼ複製ですが、私のコードは機能していません。ウィジェット ID とそれを証明するログ ステートメントを含むインテント エクストラを追加していますが、複数のインスタンスがあるウィジェットの 1 つをクリックすると、最後の appWidgetId しか取得できません。2 番目のウィジェットが追加された後、最初のウィジェットの意図が変わっているようです。その他の投稿のコードが機能する場合、私は何かを見落としているに違いありません。
public class PhcaAppWidgetProvider extends AppWidgetProvider {
private static final String ACTION_CLICK = "com.skipmorrow.phca.PhcaAppWidgetProvider.WIDGET_CLICKED";
private final String widgetPageName = "_widget";
private static final String PREFS_NAME = "PHCA";
private static final String PREF_PREFIX_KEY = "prefix_";
private static String MY_DEBUG = "PhcaAppWidget";
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
Log.d(MY_DEBUG, "Provider.onUpdate");
}
@Override
public void onReceive(Context context, Intent intent) {
String intentAction = intent.getAction();
Log.d(MY_DEBUG, "Provider.onReceive(); action = " + intentAction);
Bundle extras = intent.getExtras();
// make a list of all extras, just so I can see what is in there...
if (extras!=null) {
Set<String> ks = extras.keySet();
Iterator<String> iterator = ks.iterator();
while (iterator.hasNext()) {
String s = iterator.next();
Log.d(MY_DEBUG, "Provider.Key found: " + s);
}
}
else {
Log.d(MY_DEBUG, "Provider.extras was null");
}
int[] appWidgetIds1 = intent.getIntArrayExtra("appWidgetIds");
if (extras!=null && extras.containsKey("appWidgetIds")){
// sometimes the intent comes back with an array of appWidgetIds, and sometimes the appWidgetId is stored
// in the one extra "appWidgetId" Clicks never come with the array of appWidgetIds. They always come by
// themselves
Log.d(MY_DEBUG, "Provider.Intent extras does contain a key appWidgetIds");
if (appWidgetIds1!=null) Log.d(MY_DEBUG, "Provider.Intent int array appWidgetIds1 size is " + appWidgetIds1.length);
for (int i = 0; i<appWidgetIds1.length; i++) {
int appWidgetId = appWidgetIds1[i];
Log.d(MY_DEBUG, "Provider.Intent appWidgetIds1[" + i + "] = " + appWidgetId);
if (intentAction.equals("android.appwidget.action.APPWIDGET_UPDATE")) {
Log.d(MY_DEBUG, "Provider.APPWIDGET UPDATE");
updateWidgetState(context, intentAction, appWidgetId);
} else if (intentAction.equals("android.appwidget.action.APPWIDGET_DELETED")) {
// do nothing
}
else {
super.onReceive(context, intent);
}
}
} else {
String intentData = intent.getDataString();
Log.d(MY_DEBUG, "Provider.intent data = " + intentData);
Integer appWidgetId = intent.getIntExtra("appWidgetId", -1);
Log.d(MY_DEBUG, "Provider.appWidgetId = " + appWidgetId);
if (intentAction.equals(ACTION_CLICK)) {
Log.d(MY_DEBUG, "Provider.Clicked");
SharedPreferences myPrefs = context.getSharedPreferences(PREFS_NAME, Context.MODE_WORLD_WRITEABLE);
Integer objNum = myPrefs.getInt(PREF_PREFIX_KEY + appWidgetId, -1);
Log.d(MY_DEBUG, "Provider.ObjNum = " + objNum);
if (objNum > -1) {
Log.d(MY_DEBUG, "Provider.Executing...");
PageAction pa = (PageAction) CommonActivity.GetPageObjectAtIndex(context, widgetPageName, objNum);
pa.ExecuteActionFromWidgetClick(context);
}
}
else {
super.onReceive(context, intent);
}
}
}
public static void updateWidgetState(Context paramContext, String paramString, Integer appWidgetId)
{
Log.d(MY_DEBUG, "Provider.updateWidgetState; appWidgetId = " + appWidgetId + "; paramString = " + paramString);
RemoteViews localRemoteViews = buildUpdate(paramContext, paramString, appWidgetId);
ComponentName localComponentName = new ComponentName(paramContext, PhcaAppWidgetProvider.class);
AppWidgetManager.getInstance(paramContext).updateAppWidget(localComponentName, localRemoteViews);
}
private static RemoteViews buildUpdate(Context ctx, String paramString, Integer appWidgetId)
{
Log.d(MY_DEBUG, "Provider.buildUpdate(); appWidgetId = " + appWidgetId + "; paramString = " + paramString);
RemoteViews views = new RemoteViews(ctx.getPackageName(), R.layout.phca_appwidget);
if (paramString.equals("android.appwidget.action.APPWIDGET_UPDATE")) {
Log.d(MY_DEBUG, "Provider.buildUpdate().. APPWIDGET_UPDATE");
Intent intent = new Intent(ctx, PhcaAppWidgetProvider.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(ACTION_CLICK);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
Uri data = Uri.withAppendedPath(
Uri.parse("ABCD" + "://widget/id/")
,String.valueOf(appWidgetId));
intent.setData(data);
Log.d(MY_DEBUG, "Provider.Added intent extra \"" + AppWidgetManager.EXTRA_APPWIDGET_ID + "\" = " + appWidgetId);
PendingIntent pendingIntent = PendingIntent.getBroadcast(ctx, appWidgetId, intent , PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.phca_appwidget_layout, pendingIntent);
}
if(paramString.equals(ACTION_CLICK))
{
Log.d(MY_DEBUG, "Provider.buildUpdate().. CLICKED");
Toast.makeText(ctx, "ACTION_CLICK", Toast.LENGTH_LONG).show();
}
return views;
}
}
構成アクティビティ (ListActivity) があります。これが私の onListItemClick です。
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
Toast.makeText(getApplicationContext(), "onListItemClick", Toast.LENGTH_SHORT);
Log.d(MY_DEBUG, "Configurator.onListItemClick");
SharedPreferences.Editor prefs = getSharedPreferences(PREFS_NAME, 0).edit();
prefs.putInt(PREF_PREFIX_KEY + mAppWidgetId, position);
prefs.commit();
Log.d(MY_DEBUG, "Configurator.Prefs.commit()");
// Push widget update to surface with newly set prefix
Log.d(MY_DEBUG, "Configurator.calling updateWidgetState with appWidgetId = " + mAppWidgetId);
PhcaAppWidgetProvider.updateWidgetState(getApplicationContext(), "android.appwidget.action.APPWIDGET_UPDATE", mAppWidgetId);
Log.d(MY_DEBUG, "Configurator.updateWidgetState complete");
Intent resultValue = new Intent();
Uri data = Uri.withAppendedPath(
Uri.parse("ABCD" + "://widget/id/")
,String.valueOf(mAppWidgetId));
resultValue.setData(data);
resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
Log.d(MY_DEBUG, "Configurator.Creating widget with id = " + mAppWidgetId);
setResult(RESULT_OK, resultValue);
finish();
}
私はこれに 2 日間取り組んできましたが、誰かが私のやり方の間違いを指摘してくれることを願っています。仮想電子ビールは、これを解決できる人を待っています:)