6

我创建了一个子类PreferenceFragmentimplements CompoundButton.OnCheckedChangeListener。我有一个包含Switch(的子类CompoundButton)的首选项。这是我为开关的值更改时创建的回调:

@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    mAppController.doSomething(isChecked);
    Log.v("rose_tag", "hi");
}

OnCreate我声明如下偏好:

Switch mySwitch = (Switch) myView.findViewById(R.id.switch);
mySwitch.setEnabled(true);
mySwitch.setOnCheckedChangeListener(this);

当视图第一次打开时调用回调(回调中的断点被击中),但没有日志打印,并且回调永远不会被再次调用,即使我打开和关闭开关也是如此。我怎样才能使这个回调工作?

我还尝试创建一个内联匿名侦听器。我也尝试使用一个简单ButtononClick监听器,但这也不起作用。

4

2 回答 2

8

我可以看到您正在尝试将PreferenceFragment用作任何其他正常片段。但是,您必须考虑正确的机制,一个示例是您不能使用所有小部件来为用户制作首选项视图,您必须使用Preference对象(请参阅 Preference 子类)。

另一个示例是您必须使用它addPreferencesFromResource(int)来扩展 XML 资源的首选项。

检查上面的两个链接和这个例子

我希望它可以帮助你。

于 2013-06-18T21:32:53.960 回答
2

如果您使用 Jorge Gil 的 anwser,您将无法轻松获得对您在 PreferenceScreen 中声明的视图的引用。但是,您可以轻松获得偏好对象之一,在这种情况下是 SwitchPreference。所以在你的 res/xml/preferences.xml 添加你的开关偏好:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:key="screen">

    <SwitchPreference
            android:key="switch_preference"
            android:title="title"
            android:summary="summary" />

</PreferenceScreen>

然后在您的 PreferenceFragment/PreferenceActivity 的 onCreate 函数中添加:

    addPreferencesFromResource(R.xml.preferences);      
    SwitchPreference switchPref = (SwitchPreference) findPreference("switch_preference");

    switchPref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {

        @Override
        public boolean onPreferenceChange(Preference preference, Object newValue) {
            Log.e(getClass().getSimpleName(),"onPreferenceChange:" + newValue);
            return true;
        }
    });
于 2013-06-25T12:04:17.453 回答