0

ウィジェットを作っています。クリックすると数字がランダムになります。このウィジェットをホーム画面に複数追加すると、クリックと同時に乱数を生成し始めます。私が欲しいのは、ウィジェットがクリックされたときに、それ自体のみが更新され、その周りの他のウィジェットは更新されないことです。私を助けてください。私のコード: クラス UpdateWidgetService

@Override
public void onStart(Intent intent, int startId) {
    // create some random data
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this.getApplicationContext());
    int[] allWidgetIds = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS);
    for (int widgetId : allWidgetIds) {
        // create some random data
        int number = (new Random().nextInt(100));

        RemoteViews remoteViews = new RemoteViews(this.getApplicationContext().getPackageName(), R.layout.widget_layout);
        Log.w("WidgetExample", String.valueOf(number));
        // Set the text
        remoteViews.setTextViewText(R.id.update, "Random: " + String.valueOf(number));

        // Register an onClickListener
        Intent clickIntent = new Intent(this.getApplicationContext(), MyWidgetProvider.class);
        clickIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
        clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, widgetId);

        PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), widgetId, clickIntent, 0);
        remoteViews.setOnClickPendingIntent(R.id.btn_update, pendingIntent);
        appWidgetManager.updateAppWidget(widgetId, remoteViews);
    }
    stopSelf();
    super.onStart(intent, startId);
}

クラス MyWidgetProvider:

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    Log.w(LOG, "onUpdate method called");
    // Get all ids
    ComponentName thisWidget = new ComponentName(context, MyWidgetProvider.class);
    int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);

    // Build the intent to call the service
    Intent intent = new Intent(context.getApplicationContext(), UpdateWidgetService.class);
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, allWidgetIds);

    // Update the widgets via the service
    context.startService(intent);
}
4

1 に答える 1

0

各ウィジェットは特定の ID で識別されます。あなたのUpdateWidgetServiceクラスは、ID を正しくループしているように見えます。

問題はあなたのMyWidgetProvider.onUpdate()方法にあります。このコードは間違っています:

// Get all ids
ComponentName thisWidget = new ComponentName(context, MyWidgetProvider.class);
int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);

コメントは、それが間違っている理由を説明しています -すべてのウィジェット ID を取得します。


onUpdate()メソッドのパラメーターを見てください。

  • public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)

ここでは、ウィジェット ID の配列が提供されていることがわかります。この配列を更新サービスに渡す必要があります。

  • int[] appWidgetIds

したがって、コードは次のようになります。

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    Log.w(LOG, "onUpdate method called");

    // Build the intent to call the service
    Intent intent = new Intent(context.getApplicationContext(), UpdateWidgetService.class);
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);

    // Update the widgets via the service
    context.startService(intent);
}

そうすれば、毎回すべてのウィジェットを更新するのではなく、システムが送信するウィジェットのみを更新できます。

于 2014-05-16T14:50:51.510 に答える