10

クリックすると乱数を生成するウィジェットをアンドロイドで作成しています。ウィジェットがホーム画面に単独である場合は完全に機能しますが、ウィジェットを複数追加すると、同時に乱数が生成され始めます。個々のウィジェットをクリックすると、すべてのウィジェットが更新されます。多くの乱数が発生します。私が望むのは、各ウィジェットを他のウィジェットから分離することです。基本的に、ウィジェットをクリックすると、それ自体のみが更新され、その周りの他のウィジェットは更新されません。これは、すべてのウィジェットを更新する update メソッドとは対照的に、現在のウィジェットの ID を取得し、その ID のみを更新することで達成できると思います。どうすればいいですか?

私のコード

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
        int[] appWidgetIds) {

    // Get all ids
    ComponentName thisWidget = new ComponentName(context,
            MyWidgetProvider.class);
    int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
    for (int widgetId : allWidgetIds) {
        // Create some random data
        int number = (new Random().nextInt(100));

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

        // Register an onClickListener
        Intent intent = new Intent(context, MyWidgetProvider.class);

        intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);

        PendingIntent pendingIntent = PendingIntent.getBroadcast(context,
                0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        remoteViews.setOnClickPendingIntent(R.id.update, pendingIntent);
        appWidgetManager.updateAppWidget(widgetId, remoteViews);
    }
}

概要:

このコードは update メソッドであり、ウィジェットがクリックされたときに呼び出されます。このメソッドでは、ホーム画面上のすべてのウィジェット ID を更新するのではなく、それを呼び出したウィジェット ID のみを更新する必要があります。

4

1 に答える 1

12

私は同じ問題を抱えていて、それを解決するためにこの方法を見つけました
: appWidgetId):

Intent clickIntent = new Intent(context, DigiStation.class);
clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, appWidgetId, clickIntent, 0);

2.現在のインスタンスのビューのみを更新します。

appWidgetManager.updateAppWidget(appWidgetId, views);

3.Android はインテントを再利用するため、インテントを作成するときは必ず一意の ID を指定してください。そうしないと、以前に使用した同じインテントがすべてのインスタンスに対してトリガーされます。

PendingIntent pendingIntent = PendingIntent.getBroadcast(context, appWidgetId, clickIntent, 0);

4.クリックイベントを処理するとき、インテントの「追加」ペイロードから appWidgetId を取得します。詳細については、こちら
をご覧ください。

于 2012-07-30T07:04:31.117 に答える