Добавить несколько виджетов приложения с различной конфигурацией?

Я создал виджет, который отображает простое текстовое представление, которое можно редактировать как текст редактирования в операции настройки. Я сохраняю введенный текст с общими настройками, чтобы пользователь мог нажать на виджет для редактирования текста, и уже введенный текст появится в поле 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();   

    }
 Jakob19 окт. 2012 г., 20:45
Это работает точно так же, как когда я начал работать над этой проблемой, prefs сохраняются и загружаются, но когда я в или больше виджетов, они все показывают одинаковый текст.
 Tim19 окт. 2012 г., 20:40
Так что именно означает «не работает»? Вы прошли через отладчик? Не находит ли loadPrefs сохраненное значение? Вы должны будете сделать некоторую отладку, это звучит как.
 Jakob19 окт. 2012 г., 20:33
@Tim, да я тоже обновил loadprefs, так же, как в saveprefs
 Tim19 окт. 2012 г., 20:27
Вы обновилиsavePrefs также как иloadPrefs?
 Jakob19 окт. 2012 г., 20:55
но я не должен как-то использовать: setSharedPreferencesName

Ответы на вопрос(1)

Решение Вопроса

getDefaultSharedPreferences Вот. Все виджеты имеют одни и те же общие настройки по умолчанию, поэтому они будут постоянно перезаписывать друг друга.

У меня была такая же ситуация в моем собственном приложении, поэтому я использовал файл пользовательских настроек для каждого виджета. Вы можете назвать файл настроек с помощью widgetID, и тогда каждый виджет всегда получит свой уникальный набор предпочтений.

В конфигурации PreferenceActivity:

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

Это сохранит все настройки PreferenceActivity в файле настроек, названном в честь идентификатора виджета.

Затем в самом виджете просто получите файл, соответствующий его идентификатору:

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

И получить настройки, как обычно.

 Jakob19 окт. 2012 г., 19:05
Большое спасибо, но я не могу заставить его работать, куда именно я должен поместить это: this.getPreferenceManager (). SetSharedPreferencesName ("widget" + String.valueOf (mAppWidgetId));
 Tim19 окт. 2012 г., 19:19
Эта строка применяется только если вы используетеPreferenceActivity, Если вы просто используете обычное действие для сохранения настроек вручную, просто используйте код, похожий на мой второй блок кодаcontext.getSharedPreferences(...), @Harteg
 Tim18 окт. 2012 г., 21:55
Также я теперь вижу, что вы используетеActivity а неPreferenceActivity, но концепция должна быть такой же. Вы можете рассмотреть вопрос оPreferenceActivity класс, поскольку это делает эти виды деятельности по настройке намного проще для создания.
 Jakob19 окт. 2012 г., 19:45
Я не уверен, что понимаю, извините, я новичок. Я обновил вопрос.

Ваш ответ на вопрос