很奇怪的报了一个cast exception
FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.augusta.offlinelog/com.augusta.offlinelog.KernelLogPrefActivity}: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
at android.app.ActivityThread.access$600(ActivityThread.java:123)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4424)
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:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at android.preference.ListPreference.onSetInitialValue(ListPreference.java:278)
at android.preference.Preference.dispatchSetInitialValue(Preference.java:1309)
at android.preference.Preference.onAttachedToHierarchy(Preference.java:1124)
at android.preference.PreferenceGroup.addPreference(PreferenceGroup.java:156)
at com.augusta.offlinelog.KernelLogPrefActivity.onCreate(KernelLogPrefActivity.java:40)
at android.app.Activity.performCreate(Activity.java:4465)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
... 11 more
报错位置源代码如下
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.levelpreference);
mLevelPrefs = new KernelLogLevelPrefs(this);
preKernellv = (PreferenceCategory) findPreference(KernelLogLevelPrefs.KERNEL_LEVEL_CATEGORY);
if(preKernellv != null){
m_arryetp = new ListPreference[Prefs.tagArry.length];
for(int i = 0; i < Prefs.tagArry.length ; ++i){
String data = mLevelPrefs.getString(KernelLogLevelPrefs.kernellogleveltagArry[i], "5");
m_arryetp[i] = new ListPreference(this);
m_arryetp[i].setTitle(KernelLogLevelPrefs.kernellogleveltagArry[i]);
m_arryetp[i].setSummary(data);
m_arryetp[i].setDialogTitle(KernelLogLevelPrefs.kernellogleveltagArry[i]);
m_arryetp[i].setEntryValues(R.array.klevel_values);
m_arryetp[i].setEntries(R.array.klevel_values);
m_arryetp[i].setDefaultValue(R.string.kernel_level_default);
preKernellv.addPreference(m_arryetp[i]);
}
}
}
在源码中查看错误位置的代码如下
protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
setValue(restoreValue ? getPersistedString(mValue) : (String) defaultValue);
}
目测是吧defaultValue转换成String报错了.但是这个default我是在strings.xml里定义好了的一个string
<string name="kernel_level_default">5</string>
很奇怪 为什么在源码的红色部分确成了integer.
m_arryetp[i].setDefaultValue(R.string.kernel_level_default);
修改为
m_arryetp[i].setDefaultValue("5");
就恢复正常.