Java 添加几个配置不同的AppWidget?
我创建了一个小部件,它显示一个简单的文本视图,可以在配置活动中作为编辑文本进行编辑。我用共享的首选项保存输入的文本,因此用户可以点击小部件编辑文本,并且已经输入的文本显示在edittextfield中。 我的问题是这个。我希望用户能够添加多个小部件,但是当添加second小部件时,从共享首选项加载与其他小部件相同的文本。并且,当一个小部件被编辑时,另一个小部件也被编辑。希望我说清楚了。我有一个想法,它与AppWidgetId有关,但我无法理解 这是我的代码,有点简化Java 添加几个配置不同的AppWidget?,java,android,sharedpreferences,android-appwidget,Java,Android,Sharedpreferences,Android Appwidget,我创建了一个小部件,它显示一个简单的文本视图,可以在配置活动中作为编辑文本进行编辑。我用共享的首选项保存输入的文本,因此用户可以点击小部件编辑文本,并且已经输入的文本显示在edittextfield中。 我的问题是这个。我希望用户能够添加多个小部件,但是当添加second小部件时,从共享首选项加载与其他小部件相同的文本。并且,当一个小部件被编辑时,另一个小部件也被编辑。希望我说清楚了。我有一个想法,它与AppWidgetId有关,但我无法理解 这是我的代码,有点简化 public class W
public class WidgetConfig extends Activity implements OnClickListener, OnItemSelectedListener {
AppWidgetManager awm;
int awID;
Context c;
EditText info;
Button b;
String note;
int styleStart = -1, cursorLoc = 0;
SharedPreferences sp;
Spinner spinner;
String[] paths = { "10", "20", "30" };
File path = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.widgetconfig);
c = WidgetConfig.this;
info = (EditText)findViewById(R.id.etwidgetconfig);
...
b = (Button)findViewById(R.id.bwidgetconfig);
loadPrefs();
b.setOnClickListener(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 );
}
awm = AppWidgetManager.getInstance(c);
}
...
private void loadPrefs(){
sp = PreferenceManager.getDefaultSharedPreferences(this);
note = sp.getString("NOTE", "DEFAULT");
info.setText(note);
}
private void savePrefs(String key, String value){
sp = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor editor = sp.edit();
editor.putString(key, value); // value to store
editor.commit();
}
public void onClick(View v) {
// TODO Auto-generated method stub
savePrefs("NOTE", info.getText().toString());
RemoteViews views = new RemoteViews(c.getPackageName(), R.layout.widget);
views.setTextViewText(R.id.tvConfigInput, info.getText());
ComponentName thisWidget = new ComponentName(this, Widget.class);
AppWidgetManager manager = AppWidgetManager.getInstance(this);
manager.updateAppWidget(thisWidget, views);
Intent in = new Intent(c, WidgetConfig.class);
PendingIntent pi = PendingIntent.getActivity(c, 0, in, PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.B_EditAgain, pi);
awm.updateAppWidget(awID, views);
Intent result = new Intent();
result.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, awID);
setResult(RESULT_OK, result);
finish();
}
}
更新:
所以我试过这个,但是没有什么不同,仍然不起作用
private void loadPrefs(){
sp = context.getSharedPreferences("widget" + String.valueOf(appWidgetId)
, Context.MODE_PRIVATE);
note = sp.getString("Note", "");
info.setText(note);
}
private void savePrefs(String key, String value){
sp = context.getSharedPreferences("widget" + String.valueOf(appWidgetId)
, Context.MODE_PRIVATE);
Editor editor = sp.edit();
editor.clear();
editor.putString("Note", info.getText().toString());
editor.putString(key, value); // value to store
editor.commit();
}
您可能不想在此处使用
GetDefaultSharedReferences
。所有小部件共享相同的默认共享首选项,因此它们将不断地相互覆盖
我在自己的应用程序中也遇到了同样的情况,所以我为每个小部件使用了一个自定义首选项文件。您可以使用widgetID命名首选项文件,然后每个小部件将始终获得自己独特的首选项集
在配置首选项活动中:
this.getPreferenceManager().setSharedPreferencesName(
"widget" + String.valueOf(mAppWidgetId)
);
这会将所有PreferenceActivity设置存储到以小部件id命名的首选项文件中
然后在小部件中,只需检索与其id对应的文件:
preferences = context.getSharedPreferences(
"widget" + String.valueOf(appWidgetId)
, Context.MODE_PRIVATE);
而且我现在看到您使用的是
活动
,而不是首选项活动
,但概念应该是相同的。您可以考虑查看<代码>首选项活动< /Cord>类,因为它使这些配置活动更容易创建。非常感谢,但我不能使它工作,在哪里我应该把这个:GETPaySnEngEngAgEnter()。StasSydAdvaseNeSeNeX(“小部件”+ Strord.ValueOf(MappWistGeTeD));该行仅适用于使用首选项活动的情况。如果您只是使用常规活动手动存储首选项,那么只需使用类似于我的第二个代码块context.getSharedReferences(…)
的代码即可@HartegI我不太明白,抱歉我是初学者。我更新了问题。您是否更新了savePrefs
以及loadPrefs
?@Tim是的,我也更新了loadPrefs,与saveprefso中的相同,“不工作”到底是什么意思?你在调试器中进行过调试吗?loadPrefs没有找到保存的值吗?您需要进行一些调试,这听起来像是。它的工作原理与我开始处理此问题时完全相同,prefs会被保存和加载,但当我在一个或多个小部件上运行时,它们都显示完全相同的文本。但我不应该使用:setSharedPreferencesName吗