OnSharedPreferenceChangeListener не регистрирует изменения в предпочтениях - PullRequest
0 голосов
/ 07 мая 2011

Я работаю над списком предпочтений, и я реализовал OnSharedPreferenceChangeListener, чтобы изменить текст в текстовом представлении в зависимости от того, какой элемент выбран в предпочтении списка.Однако он не регистрирует никаких изменений, и у меня закончились идеи, поэтому любая помощь будет оценена.Спасибо

public class pref extends PreferenceActivity implements OnSharedPreferenceChangeListener {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.prefs);
    setContentView(R.layout.main);

    TextView text = (TextView) findViewById(R.id.textView1);
    String keys = null;
    SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
    pref.registerOnSharedPreferenceChangeListener(this);


    keys = pref.getString("listPref1", "");
    if (keys == "ON")
    {
        text.setText("ON");
    }
    else if (keys == "OFF")
    {
        text.setText("OFF");
    }
    else{
        text.setText("Choose One");
    }
}

@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
        String key) {
    //What code to I put in here to have the listener register the change
}

}

Ответы [ 4 ]

3 голосов
/ 07 мая 2011

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

Может быть что-то простоекак:

if(key.equals("listPref1"))
   text.setText("ON"); // Need to make text a class variable
2 голосов
/ 08 мая 2011

Спасибо всем за помощь, я разобрался с большинством из них, вот код

SharedPreferences prefs = PreferenceManager
            .getDefaultSharedPreferences(this);

    TextView text = (TextView) findViewById(R.id.textView1);

    if (prefs.getString("listPref1", "").equals("OFF")) {
        text.setText("goodbye");
    } else if (prefs.getString("listPref1", "").equals("ON")) {
        text.setText("hello");
    }

    prefs.registerOnSharedPreferenceChangeListener(this);

}

@Override
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
    TextView text = (TextView) findViewById(R.id.textView1);

    if (prefs.getString("listPref1", "").equals("OFF")) {
        text.setText("goodbye");
    } else if (prefs.getString("listPref1", "").equals("ON")) {
        text.setText("hello");
    }
}

}

Как видите, я должен повторить оператор if / else, если я помещу его только в слушателя, ничего не получится, пока не будет внесено изменение, а если он находится только вне слушателя, он будет прочитан только при первом запуске приложения и изменения не зарегистрированы.

Нет ли кода, который заставит слушателя уведомить об изменении, и код будет перезапущен?

1 голос
/ 07 мая 2011

Ваш код выглядит так, как будто он должен работать: вы можете попробовать выйти из системы, чтобы убедиться, что он делает то, что должен.Переместите весь условный код в слушатель.

@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
        String key) {
    android.util.Log.v("PREFERENCE CHANGE", "[" + key + "]");
    if ("listPref1".equals(key)) {
        String keys = pref.getString("listPref1", "");
        if (keys == "ON") {
            text.setText("ON");
        } else if (keys == "OFF") {
            text.setText("OFF");
        } else {
            text.setText("Choose One");
        }
    }
}
0 голосов
/ 07 мая 2011

У вас нет кода для фактического обновления ваших SharedPreferences. Слушатель будет активирован только тогда, когда ваш pref объект будет отредактирован. Пример ...

pref.edit().putString("listPref1", "ONE").commit();
...