OnSharedPreferenceChangeListener未在首选项中注册更改

时间:2011-05-07 17:22:21

标签: android listener listpreference

我正在研究listpreferences,并且我已经实现了OnSharedPreferenceChangeListener,以根据listpreference上选择的项目来更改textview上的文本。但是,它没有注册任何更改,我已经没有想法,所以任何帮助将不胜感激。感谢

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 个答案:

答案 0 :(得分:3)

您的代码看起来很适合注册偏好更改,您需要在onSharedPreferenceChanged方法中放置一些代码,以便在更改时处理首选项。请记住,当任何首选项更改时,您将收到回调,因此您需要在方法中进行一些过滤,以确保它是您感兴趣的内容。

可能是一件简单的事情:

if(key.equals("listPref1"))
   text.setText("ON"); // Need to make text a class variable

答案 1 :(得分:2)

谢谢大家的帮助,我现在将大部分内容排序在这里是代码

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语句,如果我只将它放在监听器中,那么在进行更改之前什么都不会发生,如果它只在监听器之外,它只会在应用程序首次运行时被读取并且没有注册更改。

是否有代码让侦听器通知已进行更改并重新运行代码?

答案 2 :(得分:1)

您的代码看起来应该有效:您可以尝试注销以确保其执行应有的操作。将所有条件代码移动到侦听器中。

@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");
        }
    }
}

答案 3 :(得分:0)

您没有任何代码可以实际更新您的SharedPreferences。只有在编辑pref对象时才会触发侦听器。实施例...

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