2013-06-12 34 views
6

我创建了PreferenceFragment的子类,它实现了CompoundButton.OnCheckedChangeListener。我有一个首选项包含SwitchCompoundButton的一个子类)。下面是我对当开关的值更改创建的回调:按钮侦听器不工作偏好片段

@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侦听器,但这也不起作用。

+0

你检查你的进口?有时会发生错误的进口声明。你的onCheckedChangeListener是如下导入的:android.widget.CompoundButton.OnCheckedChangeListener? – Opiatefuchs

+0

我有'import android.widget.CompoundButton' –

+0

也许另一种方法是:mySwitch.setOnCheckedChangeListener(new OnCheckedChangeListener(){});而不是设置实现的chekedChangeListener。你可以试试这个吗? – Opiatefuchs

回答

8

我可以看到你试图使用PreferenceFragment作为任何其他正常的片段。但是,您必须计算正确的机制,例如,您无法使用所有窗口小部件为用户设置首选项视图,您必须使用Preference对象(请参阅首选子类)。

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

检查上面的这两个链接,这example

我希望它可以帮助你。

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