我正在尝试创建一个小部件,用户必须为其提供名称。根据该名称,收集并显示数据。在小部件中是刷新按钮以刷新此数据。
问题是在配置类和AppWidgetProvider类之间共享此名称。我尝试过:
在配置类中:
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”。我检查过awID
和widgetId
是否相等。
这可能是因为我使用不同的上下文? (只是在这里猜测)
那么解决这个问题的方法是什么?
修改 当我在屏幕上打印上下文时,我得到以下内容:
配置类:com.app.myapp.WidgetConfigActivity@40774d18
AWP课程:android.app.ReceiverRestrictedContext@406ad290
答案 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();