3

我创建了一个小部件,它显示一个简单的文本视图,可以在配置活动中作为 Edittext 进行编辑。我使用共享首选项保存输入的文本,因此用户可以点击小部件来编辑文本,并且已经输入的文本出现在编辑文本字段中。我的问题是这个。我希望用户能够添加多个小部件,但是当添加第二个小部件时,会从共享首选项中加载与另一个小部件中相同的文本。而且,当小部件被编辑时,另一个也是如此。希望我很清楚。我有点想它与 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();   

    }
4

1 回答 1

4

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

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

在配置 PreferenceActivity 中:

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

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

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

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

并像平常一样检索首选项。

于 2012-10-18T19:52:34.917 回答