0

ユーザーが名前を指定する必要があるウィジェットを作成しようとしています。その名前に基づいて、データが収集されて表示されます。ウィジェットには、このデータを更新するための更新ボタンがあります。

問題は、構成クラスとAppWidgetProviderクラスの間でこの名前を共有することです。私が試したこと:

  • ウィジェットでEditTextを使用するだけです。configクラスで、EditTextに名前を設定し、AppWidgetProviderクラスで取得します。AWPでテキストを取得する方法が見つからないため、これは機能しません。
  • SharedPreferencesを使用します。

構成クラス:

c = SelectWidgetStationActivity.this;

// Getting info about the widget that launched this Activity.
Intent i = getIntent();
Bundle extras = i.getExtras();
if (extras != null)
    awID = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(c);
prefs.edit().putString("widgetname" + awID, name);
prefs.edit().commit();

AWPクラスの場合:

@Override
public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals(ACTION_WIDGET_RECEIVER)) { //ACTION_WIDGET_RECEIVER is the action fired by the refresh button
        this.onUpdate(context, AppWidgetManager.getInstance(context), AppWidgetManager.getInstance(context).getAppWidgetIds(new ComponentName("com.app.myapp", "com.app.myapp.MyWidgetProvider")));
    }
}

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);

for (int widgetId : appWidgetIds) {
        name = prefs.getString("widgetname" + widgetId, "N/A"));
    //more code

name私に「N/A」を与え続けます。私はそれをチェックしawIDwidgetId等しいです。これはおそらく、私が異なるコンテキストを使用しているという事実によるものですか?(ここで推測するだけです)

では、この問題を解決する方法は何ですか?

編集 画面にコンテキストを印刷すると、次のようになります。

  • 構成クラス:com.app.myapp.WidgetConfigActivity@40774d18

  • AWPクラス:android.app.ReceiverRestrictedContext@406ad290

4

4 に答える 4

3

好奇心からこれをもう一度やり直して、これに気づきました:

prefs.edit().putString("widgetname" + awID, name);
prefs.edit().commit();

これにより、2つの異なるEditorインスタンスが得られます。ここで行うことは、エディターを1つ取得し、設定を入れてそのままにしておくことです。次に、新しい(変更されていない)エディターを取得し、それをコミットします(=変更は書き込まれません)。小さなプロジェクトでテストしたところ、意図したとおりに正しくコミットされません。

したがって、コードを次のようなものに置き換えてみてください。

Editor e = prefs.edit();
e.putString("widgetname" + awID, name);
e.commit();

またはコミットをチェーンします

prefs.edit().putString("widgetname" + awID, name).commit();
于 2011-11-08T14:07:23.347 に答える
0

あなたは試すかもしれません

SharedPreferences prefs = context.getSharedPreferences("someName", Context.MODE_PRIVATE);
于 2011-11-08T12:54:00.877 に答える
0
prefs.edit().putString("widgetname" + awID, name);

設定を書くときはそうでnameはないことを確認してください。nullそれ以外の場合はnull、もう一度読み取ると、デフォルト値の「N / A」が返されます(キーが見つからなかった場合など)。

于 2011-11-08T13:04:38.620 に答える
-1
public static final String PREFS_NAME = "MyPrefsFile";
private static final String PREF_USERNAME = "username";


SharedPreferences pref = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
 //to access data from preference 

uid.setText(pref.getString(PREF_USERNAME, null));

//to set value in preference
   getSharedPreferences(PREFS_NAME, MODE_PRIVATE).edit()
                    .putString(PREF_USERNAME, uid.getText().toString()).commit();
于 2011-11-08T13:11:03.170 に答える