我将共享偏好设置填充到PreferenceFragment
,作为ActionBar
中的标签提供。首选项填充在片段的onCreate
方法
public static class WIKPreferenceFragment extends PreferenceFragment
{
@Override
public void onCreate ( Bundle bundle )
{
super.onCreate( bundle );
this.addPreferencesFromResource( R.layout.settings_fragment );
}
}
选择标签后,会直接添加PreferenceFragment
,
public void onTabSelected ( Tab tab, FragmentTransaction transaction )
{
transaction.replace( R.id.tab_view_target, new WIKPreferenceFragment() );
( (WIKActivity) this.activity ).setTabMemory( tab.getPosition() );
}
R.layout.settings_fragment
的内容是
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="match_parent" >
<PreferenceCategory android:title="@string/category_proximity_settings" >
<CheckBoxPreference
android:key="@+key/USE_PASSIVE_GPS"
android:summary="@string/summary_use_passive_gps"
android:title="@string/title_use_passive_gps" />
<EditTextPreference
android:inputType="number"
android:key="@+key/GPS_TIMEOUT"
android:summary="@string/summary_gps_timeout"
android:title="@string/title_gps_timeout" />
</PreferenceCategory>
</PreferenceScreen>
使用全新安装,首选项选项卡时,首选项片段会正确显示。如果选择了另一个选项卡并返回此选项卡,则会出现以下错误:
05-14 19:23:02.366: E/AndroidRuntime(11744): FATAL EXCEPTION: main
05-14 19:23:02.366: E/AndroidRuntime(11744): Process: org.eightbeers.android.wik, PID: 11744
05-14 19:23:02.366: E/AndroidRuntime(11744): java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.lang.String
05-14 19:23:02.366: E/AndroidRuntime(11744): at android.app.SharedPreferencesImpl.getString(SharedPreferencesImpl.java:224)
05-14 19:23:02.366: E/AndroidRuntime(11744): at android.preference.Preference.getPersistedString(Preference.java:1429)
05-14 19:23:02.366: E/AndroidRuntime(11744): at android.preference.EditTextPreference.onSetInitialValue(EditTextPreference.java:154)
05-14 19:23:02.366: E/AndroidRuntime(11744): at android.preference.Preference.dispatchSetInitialValue(Preference.java:1345)
05-14 19:23:02.366: E/AndroidRuntime(11744): at android.preference.Preference.onAttachedToHierarchy(Preference.java:1140)
05-14 19:23:02.366: E/AndroidRuntime(11744): at android.preference.PreferenceGroup.addPreference(PreferenceGroup.java:163)
05-14 19:23:02.366: E/AndroidRuntime(11744): at android.preference.PreferenceGroup.addItemFromInflater(PreferenceGroup.java:104)
05-14 19:23:02.366: E/AndroidRuntime(11744): at android.preference.PreferenceGroup.addItemFromInflater(PreferenceGroup.java:45)
05-14 19:23:02.366: E/AndroidRuntime(11744): at android.preference.GenericInflater.rInflate(GenericInflater.java:488)
05-14 19:23:02.366: E/AndroidRuntime(11744): at android.preference.GenericInflater.rInflate(GenericInflater.java:493)
05-14 19:23:02.366: E/AndroidRuntime(11744): at android.preference.GenericInflater.inflate(GenericInflater.java:326)
05-14 19:23:02.366: E/AndroidRuntime(11744): at android.preference.GenericInflater.inflate(GenericInflater.java:263)
05-14 19:23:02.366: E/AndroidRuntime(11744): at android.preference.PreferenceManager.inflateFromResource(PreferenceManager.java:272)
05-14 19:23:02.366: E/AndroidRuntime(11744): at android.preference.PreferenceFragment.addPreferencesFromResource(PreferenceFragment.java:285)
05-14 19:23:02.366: E/AndroidRuntime(11744): at org.eightbeers.android.wik.activity.SettingsTab$WIKPreferenceFragment.onCreate(SettingsTab.java:27)
05-14 19:23:02.366: E/AndroidRuntime(11744): at android.app.Fragment.performCreate(Fragment.java:1688)
05-14 19:23:02.366: E/AndroidRuntime(11744): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:860)
05-14 19:23:02.366: E/AndroidRuntime(11744): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1063)
05-14 19:23:02.366: E/AndroidRuntime(11744): at android.app.BackStackRecord.run(BackStackRecord.java:684)
05-14 19:23:02.366: E/AndroidRuntime(11744): at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1450)
05-14 19:23:02.366: E/AndroidRuntime(11744): at android.app.FragmentManagerImpl$1.run(FragmentManager.java:444)
05-14 19:23:02.366: E/AndroidRuntime(11744): at android.os.Handler.handleCallback(Handler.java:733)
05-14 19:23:02.366: E/AndroidRuntime(11744): at android.os.Handler.dispatchMessage(Handler.java:95)
05-14 19:23:02.366: E/AndroidRuntime(11744): at android.os.Looper.loop(Looper.java:136)
05-14 19:23:02.366: E/AndroidRuntime(11744): at android.app.ActivityThread.main(ActivityThread.java:5105)
05-14 19:23:02.366: E/AndroidRuntime(11744): at java.lang.reflect.Method.invokeNative(Native Method)
05-14 19:23:02.366: E/AndroidRuntime(11744): at java.lang.reflect.Method.invoke(Method.java:515)
05-14 19:23:02.366: E/AndroidRuntime(11744): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
05-14 19:23:02.366: E/AndroidRuntime(11744): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608)
05-14 19:23:02.366: E/AndroidRuntime(11744): at dalvik.system.NativeStart.main(Native Method)
一些可能有用的数据点:
当CheckBoxPreference
被注释掉,或者EditTextPreference
被注释掉时(例如,如果只有一个首选项,一切正常;当然,我希望有一个以上,甚至两个以上的
如果首选项未在onCreate
中重新加载(如果已加载),则不会发生此错误;但是,如果更改了此选项,则重新选择选项卡时不会显示任何首选项
此错误通过清除用户数据,重新启动Eclipse,卸载应用程序,项目清理和手机重新启动(好吧,只有一个)而持续存在;除了手机重启(因为我只尝试过一次),它通过以前的任何组合持续存在
为了简化卸载,我将应用从WIK
重命名为AAWIK
;但是,在设置 - &gt;应用程序管理器窗口应用程序仍按字母顺序排列为WIK
。 UI中的其他任何地方--- app抽屉,卸载窗格,通知等---这是AAWIK;这可能只是一个极端的缓存问题? (编辑:这最后一个问题只是通过让手机闲置,足够长时间让我输入这个问题来解决;不再是有用的数据点,所有其他问题仍然存在。)
答案 0 :(得分:1)
通过在android:key="@+key/[keyname]"
的XML中切换android:key="[keyname]"
来解决问题。
我不打算立即接受我的回答,因为我不知道为什么这样做有效,谷歌还没有出现。
答案 1 :(得分:0)
密钥应存储为prefs.xml中的字符串(如果需要,还可以存储为其他名称)
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="pref_key_gps" translatable="false">pref_key_gps</string>
</resources>
你应该替换:
android:key="@+key/USE_PASSIVE_GPS"
为:
android:key="@string/pref_key_gps"
答案 2 :(得分:0)
现在碰到的问题是,addPreferencesFromResource ClassCastException Caused by: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
我所使用到的控件<EditTextPreference .../>
我的业务场景:
EditTextPreference
处理的数据都是数字。EditTextPreference
完成的;我是手动完成的,使用的方法是putInt
EditTextPreference
布局的时候报错。错误原因,在EditTextPreference
类内部所维护的数据是通过putString
和getString
来维护的。
所以我只需要将手动部分设置成putString
即可解决问题。
我的问题是:addPreferencesFromResource ClassCastException Caused by: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
我正在使用的小部件是:<EditTextPreference .../>
我的业务场景是:
EditTextPreference
仅包含数字。xml
将数据写入SharedPerference.Editro.putInt()
文件,而不是通过`EditTextPreference'完成。EditTextPreference
布局时应用折衷。 问题的原因是:
EditTextPreference
类中,数据由putString
和getString
维护。但是我使用的是putInt
putInt
更改为putString
可以解决问题