2

タスク リスト アプリケーションのウィジェットを実装中です。間隔を置いてウィジェットを更新するのは本当に意味がないので、ユーザーがタスクを追加または削除するたびにウィジェットを更新しようとしています:

private void updateWidget() {
    Intent intent = new Intent(mContext, WidgetProvider.class);
    intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
    int ids[] = AppWidgetManager.getInstance(mContext).getAppWidgetIds(
            new ComponentName(mContext, WidgetProvider.class));
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids);
    mContext.sendBroadcast(intent);
}

WidgetProvider クラスの onUpdate メソッド (唯一のオーバーライドされたメソッド) を次に示します。

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    if (appWidgetIds != null) {
        for (int i = 0; i < appWidgetIds.length; i++) {
            Intent intent = new Intent(context, WidgetService.class);
            intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);
            intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
            RemoteViews widget = new RemoteViews(context.getPackageName(), R.layout.widget_layout);

            widget.setRemoteAdapter(appWidgetIds[i], R.id.widget_listview, intent);

            appWidgetManager.updateAppWidget(appWidgetIds[i], widget);
        }
    }
    super.onUpdate(context, appWidgetManager, appWidgetIds);
}

WidgetService クラスの onGetViewFactory メソッド:

@Override
public RemoteViewsFactory onGetViewFactory(Intent intent) {
    return new TaskViewsFactory(getBaseContext());
}

マニフェストの関連部分:

<receiver
        android:name="com.nick.android.todo.widget.WidgetProvider"
        android:enabled="true"
        android:exported="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        </intent-filter>

        <meta-data
            android:name="android.appwidget.provider"
            android:resource="@xml/widget_provider" />
    </receiver>

    <service
        android:name="com.nick.android.todo.widget.WidgetService"
        android:enabled="true"
        android:permission="android.permission.BIND_REMOTEVIEWS" />

ウィジェットを削除してホーム画面に追加すると、リストに正しく入力されます。タスクの追加がランダムに機能することがありますが、その理由/理由がわかりません。

編集: 私の WidgetService.onGetViewFactory() が常に呼び出されるとは限らないようです。(ウィジェットはその時点で更新されます)

4

1 に答える 1

3

私はついにそれを理解しました。

ウィジェットは確かに更新されていましたが、同じアイテムでした。アイテムの新しいリストを取得し、notifyAppWidgetViewDataChanged を呼び出すには、onDataSetChanged() をオーバーライドする必要がありました。

appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.widget_listview);
于 2013-11-10T13:42:27.917 に答える