0

我正在处理 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

4 回答 4

3

您的代码看起来很适合注册以听取首选项更改,您需要在您的onSharedPreferenceChanged方法中放入一些代码来处理首选项的更改。请记住,当任何首选项更改时,您都会被回调,因此您需要在方法中进行一些过滤以确保它是您感兴趣的。

可能很简单:

if(key.equals("listPref1"))
   text.setText("ON"); // Need to make text a class variable
于 2011-05-07T17:35:21.957 回答
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 语句,如果我仅将其放在侦听器中,则在进行更改之前什么都不会得到没有注册。

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

于 2011-05-08T08:09:27.950 回答
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");
        }
    }
}
于 2011-05-07T17:46:09.473 回答
0

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

pref.edit().putString("listPref1", "ONE").commit();
于 2011-05-07T18:11:28.680 回答