如何使用SwitchPreference? (ClassCastException异常)

时间:2017-01-19 12:47:52

标签: java android android-preferences switchpreference

我尝试在SwitchPreference中使用2 PreferenceActivity。在PreferenceActivity的第一次开始时,一切正常;活动开始没有问题,显示settings.xml 如果有人注意关闭PreferenceActivity或更改SwitchPreference的状态,则问题就会开始:每次使用ClassCastException关闭应用时。这也是在没有set dafaultValue的情况下发生的。之后,如果尝试打开PreferenceActivity,应用将会关闭。 到目前为止,我不以任何方式以编程方式访问/影响存储的值,现在我只想显示设置屏幕以进行测试。如果通过

在调用活动中单击了一个菜单项,则将启动该活动
final Intent i = new Intent(this, SettingsActivity.class);
                startActivity(i);  

我尝试了不同的建议方法,例如定义布尔资源并使用它们来设置SwitchPreference的defaultValue或使用方法

PreferenceManager.setDefaultValues(this, R.xml.settings, false);

在主要活动中。这些方法都没有奏效。如果SwitchPreference显然无法保存其状态而不会导致异常,那么它是如何使用的呢?是否需要定义特定的xml属性以使首选项有效?

ClassCastException异常

    E/AndroidRuntime: FATAL EXCEPTION: main
                      java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Boolean
                          at android.app.SharedPreferencesImpl.getBoolean(SharedPreferencesImpl.java:242)
                          at android.preference.Preference.getPersistedBoolean(Preference.java:1637)
                          at android.preference.Preference.persistBoolean(Preference.java:1608)
                          at android.preference.TwoStatePreference.setChecked(TwoStatePreference.java:79)
                          at android.preference.SwitchPreference$Listener.onCheckedChanged(SwitchPreference.java:54)
                          at android.widget.CompoundButton.setChecked(CompoundButton.java:126)
                          at android.widget.Switch.setChecked(Switch.java:688)
                          at android.widget.CompoundButton.toggle(CompoundButton.java:87)
                          at android.widget.CompoundButton.performClick(CompoundButton.java:99)
                          at android.view.View$PerformClick.run(View.java:16966)
                          at android.os.Handler.handleCallback(Handler.java:615)
                          at android.os.Handler.dispatchMessage(Handler.java:92)
                          at android.os.Looper.loop(Looper.java:137)
                          at android.app.ActivityThread.main(ActivityThread.java:4745)
                          at java.lang.reflect.Method.invokeNative(Native Method)
                          at java.lang.reflect.Method.invoke(Method.java:511)
                          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
                          at dalvik.system.NativeStart.main(Native Method)

PreferenceActivity

public class SettingsActivity extends PreferenceActivity{

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      this.addPreferencesFromResource(R.xml.settings);
  }
}

settings.xml

 <?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android">
    [...]
    <PreferenceCategory
        android:title="@string/sett_not_header">
        <SwitchPreference
            android:key="@+id/sett_not_on"
            android:title="@string/sett_not_act_header"
            android:summary="@string/sett_not_act_summ"
            android:defaultValue="true"/>
        <SwitchPreference
            android:key="@+id/sett_not_mute"
            android:title="@string/sett_not_mute_header"
            android:summary="@string/sett_not_mute_summ"
            android:defaultValue="true"/>
    [...]
    </PreferenceCategory>

</PreferenceScreen>

1 个答案:

答案 0 :(得分:0)

我能够追踪异常的原因: 在字段@+id/中,假设密钥声明的工作方式与id声明的工作方式相同,我错误地使用了表达式analyzer。删除表达式DartType允许我使用SwitchPreference而不会出错。