4

構成アクティビティ、大規模なウィジェット プロバイダー、および小規模なウィジェット プロバイダーがあります。構成アクティビティから、共有設定にいくつかの値を保存します。大小のアプリ ウィジェット プロバイダーから、これらの共有設定を取得します。アプリ ウィジェットに一意の ID を与えることができず、構成アクティビティからアプリ ウィジェット プロバイダーに移動するたびに、異なる共有設定を使用したいと考えています。どうすればこれを達成できますか。

4

1 に答える 1

6

アプリ ウィジェットの各インスタンスに一意のウィジェット ID を付与するには、次のようにします。

    AppWidgetManager appWidgetManager = AppWidgetManager
                .getInstance(ConfigurationActivity.this);
    ComponentName thisAppWidget = new ComponentName(
                ConfigurationActivity.this, WidgetProvider.class);
    int[] appWidgetIds = appWidgetManager
            .getAppWidgetIds(thisAppWidget);
    Intent startBroadcast = new Intent(ConfigurationActivity.this,
                WidgetProvider.class);
    startBroadcast.putParcelableArrayListExtra("list", newsList);
    startBroadcast.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,
                appWidgetIds);
    startBroadcast.setAction("android.appwidget.action.APPWIDGET_UPDATE");
        sendBroadcast(startService);

一意の共有設定でデータを保存するには、次のようにします。

    public void setWidgetNewsCategory(Context context, String category,
        int appWidgetId) {

    Editor editor = context.getSharedPreferences(
            PREFS_NAME_CATEGORY + String.valueOf(appWidgetId),
            Context.MODE_PRIVATE).edit();
    editor.putString(PREFS_VALUE_CATEGORY + String.valueOf(appWidgetId),
            category);
    editor.commit();
}

この共有設定値は次のように取得できます。

     public String getWidgetNewsCategory(Context context, int appWidgetId) {
     SharedPreferences sharedPreferences = context.getSharedPreferences(
            PREFS_NAME_CATEGORY + String.valueOf(appWidgetId),
            Context.MODE_PRIVATE);
    return sharedPreferences.getString(
            PREFS_VALUE_CATEGORY + String.valueOf(appWidgetId), null);
}

最後に、ウィジェット プロバイダーの onReceive メソッドで、次のようにします。

public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();
    if (AppWidgetManager.ACTION_APPWIDGET_UPDATE.equals(action)) {
        Bundle extras = intent.getExtras();
        if (extras != null) {
            int[] appWidgetIds = extras
                    .getIntArray(AppWidgetManager.EXTRA_APPWIDGET_IDS);             
            if (appWidgetIds.length > 0) {
                this.onUpdate(context, AppWidgetManager.getInstance(context), appWidgetIds);//here you can call onUpdate method, and update your views as you wish
            }
        }
    } else if (AppWidgetManager.ACTION_APPWIDGET_DELETED.equals(action)) {
        Bundle extras = intent.getExtras();
        if (extras != null
                && extras.containsKey(AppWidgetManager.EXTRA_APPWIDGET_ID)) {
            final int appWidgetId = extras
                    .getInt(AppWidgetManager.EXTRA_APPWIDGET_ID);
            this.onDeleted(context, new int[] { appWidgetId });
        }
    } else if (AppWidgetManager.ACTION_APPWIDGET_ENABLED.equals(action)) {
        this.onEnabled(context);
    } else if (AppWidgetManager.ACTION_APPWIDGET_DISABLED.equals(action)) {
        this.onDisabled(context);
    }
}

これは私のために働いた一般的な解決策です。うまくいけば、それはあなたにとってもうまくいくでしょう。

于 2013-02-11T09:05:30.687 に答える