添加几个具有不同配置的appWidgets?

我创建了一个显示简单文本视图的小部件,可以在配置活动中编辑为Edittext。 我用共享偏好保存输入的文本,因此用户可以点击小部件来编辑文本,并且已经输入的文本出现在edittextfield中。 我的问题是这个。 我希望用户能够添加多个小部件,但是当添加第二个小部件时,将从共享首选项加载与其他小部件中相同的文本。 并且,当在小部件上编辑时,另一个。 希望我很清楚。 我有点想法它与appWidgetIds有关但我无法弄明白。

这是我的代码,有点简化。

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(); } 

你可能不想在这里使用getDefaultSharedPreferences 。 所有小部件共享相同的默认共享首选项,因此它们将不断地相互覆盖。

我在自己的应用程序中遇到了相同的情况,因此我为每个小部件使用了自定义首选项文件。 您可以使用widgetID命名首选项文件,然后每个小部件将始终获得它自己唯一的首选项集。

在配置PreferenceActivity中:

 this.getPreferenceManager().setSharedPreferencesName( "widget" + String.valueOf(mAppWidgetId) ); 

这会将所有PreferenceActivity设置存储到以小部件ID命名的首选项文件中。

然后在小部件本身中,只检索与其id对应的文件:

 preferences = context.getSharedPreferences( "widget" + String.valueOf(appWidgetId) , Context.MODE_PRIVATE); 

并像平常一样检索偏好。