OnSharedPreferenceChangeListener не регистрирует изменение предпочтений

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

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
}

}


person Amanni    schedule 07.05.2011    source источник


Ответы (4)


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

@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");
        }
    }
}
person Femi    schedule 07.05.2011
comment
Я пробовал ваш код, но он все еще не работает. Когда я впервые запустил приложение, текстовое представление было пустым, но когда я изменил выбранный элемент, для текстового представления было установлено значение «Выбрать один», но оно застряло на этом и не меняется независимо от элемент выбран - person Amanni; 07.05.2011
comment
Сделайте следующее: android.util.Log.v("PREFERENCE CHANGE VALUES", "["+keys+"]"); после выполнения pref.getString("listPref1", ""); и посмотрите, что он сообщает (И УБЕДИТЕСЬ, ЧТО listPref1 является правильным ключом предпочтения для использования). - person Femi; 07.05.2011
comment
Я должен проверять ключ элементов в listpreference с ключом listpref1. - person Amanni; 07.05.2011
comment
О, хорошо, тогда измените вызов на String keys = pref.getString("listpref1","");. Инфраструктура предпочтений чувствительна к регистру. - person Femi; 07.05.2011
comment
нет, дело было в моей ошибке. Я говорю, что мой ключ для моего предпочтения списка — listpref1, он имеет два элемента с ключами ON и OFF. Я хочу, чтобы что-то произошло, когда пользователь выбирает ON, а другое — когда он выбирает OFF. Правильно ли я поступаю? - person Amanni; 07.05.2011
comment
Вероятно, вам следует использовать Preference.OnPreferenceChangeListener (см. developer.android.com/reference/android /preference/ Вы можете просто зарегистрировать его, чтобы слушать только ваши предпочтения (так ((Preference) findPreference(getString("listpref1"))).setOnPreferenceChangeListener(this);), а затем реализовать public boolean onPreferenceChange(Preference preference, Object newValue), который будет вызываться, если они что-то изменят. - person Femi; 07.05.2011

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

Может быть что-то простое, например:

if(key.equals("listPref1"))
   text.setText("ON"); // Need to make text a class variable
person debracey    schedule 07.05.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, если я поместил его только в прослушиватель, ничего не получится, пока не будет сделано изменение, а если он только вне слушателя, он будет прочитан только при первом запуске приложения и изменения не зарегистрирован.

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

person Amanni    schedule 08.05.2011

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

pref.edit().putString("listPref1", "ONE").commit();
person Squonk    schedule 07.05.2011