首选项片段中的按钮监听器无法正常工作

6

我创建了PreferenceFragment的一个子类,该子类实现了CompoundButton.OnCheckedChangeListener。其中有一个偏好设置包含了一个SwitchCompountButton的子类)。这是当开关值更改时我创建的回调函数:

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

当视图首次打开时(回调中的断点被触发),回调函数会被调用,但没有日志输出,并且即使我切换开关,回调也不会再次被调用。如何让这个回调函数正常工作?

我还尝试了创建一个内联匿名侦听器。我也尝试使用一个简单的 Button 和一个 onClick 侦听器,但那也没有起作用。


你检查过导入吗?有时候会出现错误的导入声明。你的OnCheckedChangeListener是否被导入为:android.widget.CompoundButton.OnCheckedChangeListener? - Opiatefuchs
我有 import android.widget.CompoundButton - Rose Perrone
也许另一种选择是:使用mySwitch.setOnCheckedChangeListener(new OnCheckedChangeListener(){});而不是设置已实现的chekedChangeListener。你可以试试这个吗? - Opiatefuchs
是的,我已经尝试过了。我还尝试使用一个带有onClick监听器的简单的Button,但那也不起作用。 - Rose Perrone
2个回答

8
我看到你正在尝试使用PreferenceFragment作为普通片段。但是,你必须考虑正确的机制,例如,你不能使用所有小部件来创建用户的首选项视图,必须使用Preference对象(请参见首选项子类)。
另一个例子是,你必须使用addPreferencesFromResource(int)从XML资源膨胀首选项。
检查上面两个链接和这个示例
希望对你有所帮助。

2
如果您使用Jorge Gil的答案,您将无法轻松地获取对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;
        }
    });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接