小部件:存储用户首选项

时间:2011-11-08 12:50:48

标签: android widget preference

我正在尝试创建一个小部件,用户必须为其提供名称。根据该名称,收集并显示数据。在小部件中是刷新按钮以刷新此数据。

问题是在配置类和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 个答案:

答案 0 :(得分:3)

刚刚出于好奇再次经历了这一点并注意到了这一点:

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

这为您提供了2个不同的Editor个实例。 你在这里做的是获得一个编辑器,放入首选项并不管它。然后你得到一个新的(未更改的)编辑器并提交它(=没有写入更改)。刚刚在一个小项目上测试过,没有按预期正确提交。

所以尝试用这样的代码替换代码:

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

或链接

中的提交
prefs.edit().putString("widgetname" + awID, name).commit();

答案 1 :(得分:0)

您可以尝试

SharedPreferences prefs = context.getSharedPreferences("someName", Context.MODE_PRIVATE);

答案 2 :(得分:0)

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

在撰写偏好设置时,请确保name不是null。否则,当你再次阅读它时会得到null,这将返回默认值“N / A”(就像找不到密钥一样)。

答案 3 :(得分:-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();