如何使用 SwitchPreference? (ClassCastException)
How is the SwitchPreference intended to be used? (ClassCastException)
我尝试在 PreferenceActivity
中使用 2 SwitchPreference
。 PreferenceActivity
第一次启动,一切正常; activity 开始没有问题,显示 settings.xml
如果有人注意关闭 PreferenceActivity
或更改 SwitchPreference
的状态,问题就开始了:每次应用程序以 ClassCastException
关闭时。这也会在没有设置 dafaultValue 的情况下发生。之后,如果有人试图打开 PreferenceActivity
,应用程序将被关闭。
到目前为止,我还没有以任何方式 access/influence 以编程方式存储值,现在我只想显示设置屏幕以进行测试。如果在调用 activity via
中单击菜单项,将启动 activity
final Intent i = new Intent(this, SettingsActivity.class);
startActivity(i);
我尝试了此处所述的不同建议方法,例如定义布尔资源并使用它们设置 SwitchPreference
的默认值或使用方法
PreferenceManager.setDefaultValues(this, R.xml.settings, false);
主要activity。 None 的方法奏效了。如果 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)
偏好活动
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>
我能够找到异常的原因:
在字段 android:key
中,我错误地使用了表达式 @+id/
,假设键声明的工作方式与 id 声明的工作方式相同。删除表达式 @+id/
允许我使用 SwitchPreference 而不会出错。
我尝试在 PreferenceActivity
中使用 2 SwitchPreference
。 PreferenceActivity
第一次启动,一切正常; activity 开始没有问题,显示 settings.xml
如果有人注意关闭 PreferenceActivity
或更改 SwitchPreference
的状态,问题就开始了:每次应用程序以 ClassCastException
关闭时。这也会在没有设置 dafaultValue 的情况下发生。之后,如果有人试图打开 PreferenceActivity
,应用程序将被关闭。
到目前为止,我还没有以任何方式 access/influence 以编程方式存储值,现在我只想显示设置屏幕以进行测试。如果在调用 activity via
final Intent i = new Intent(this, SettingsActivity.class);
startActivity(i);
我尝试了此处所述的不同建议方法,例如定义布尔资源并使用它们设置 SwitchPreference
的默认值或使用方法
PreferenceManager.setDefaultValues(this, R.xml.settings, false);
主要activity。 None 的方法奏效了。如果 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)
偏好活动
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>
我能够找到异常的原因:
在字段 android:key
中,我错误地使用了表达式 @+id/
,假设键声明的工作方式与 id 声明的工作方式相同。删除表达式 @+id/
允许我使用 SwitchPreference 而不会出错。