首选项片段中的运行时异常

Runtime Exception in Preference Fragment

我有一个包含以下文件的偏好片段

preference.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

    <EditTextPreference
        android:defaultValue="0000"
        android:key="@string/pin"
        android:summary="Set Pin for Notes"
        android:title="Password" />

</PreferenceScreen>

偏好Activity

public class PreferenceActivity extends AppCompatActivity {

    @BindView(R.id.toolbar_settings)
    Toolbar toolbarSettings;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_settings);
        ButterKnife.bind(this);

        setSupportActionBar(toolbarSettings);

        ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {
            actionBar.setDisplayHomeAsUpEnabled(true);
        }

    }
}

最后

偏好片段

public class PreferenceFragment extends PreferenceFragmentCompat {

    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        addPreferencesFromResource(R.xml.preference);
    }
}

但是在这里调用 addPreferencesFromResources 时,我遇到了运行时异常。

这是日志堆栈

异常

02-21 22:23:36.574 8813-8813/in.snotes.snotes E/AndroidRuntime: FATAL EXCEPTION: main
    Process: in.snotes.snotes, PID: 8813
    java.lang.RuntimeException: Unable to start activity ComponentInfo{in.snotes.snotes/in.snotes.snotes.settings.PreferenceActivity}: android.view.InflateException: Binary XML file line #0: Binary XML file line #0: Error inflating class fragment
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2659)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2724)
        at android.app.ActivityThread.-wrap12(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1473)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6123)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)
     Caused by: android.view.InflateException: Binary XML file line #0: Binary XML file line #0: Error inflating class fragment
     Caused by: android.view.InflateException: Binary XML file line #0: Error inflating class fragment
     Caused by: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
        at android.app.SharedPreferencesImpl.getString(SharedPreferencesImpl.java:225)
        at android.support.v7.preference.Preference.getPersistedString(Preference.java:1601)
        at android.support.v7.preference.EditTextPreference.onSetInitialValue(EditTextPreference.java:92)
        at android.support.v7.preference.Preference.dispatchSetInitialValue(Preference.java:1517)
        at android.support.v7.preference.Preference.onAttachedToHierarchy(Preference.java:1245)
        at android.support.v7.preference.Preference.onAttachedToHierarchy(Preference.java:1257)
        at android.support.v7.preference.PreferenceGroup.addPreference(PreferenceGroup.java:194)
        at android.support.v7.preference.PreferenceGroup.addItemFromInflater(PreferenceGroup.java:126)
        at android.support.v7.preference.PreferenceInflater.rInflate(PreferenceInflater.java:355)
        at android.support.v7.preference.PreferenceInflater.inflate(PreferenceInflater.java:162)
        at android.support.v7.preference.PreferenceInflater.inflate(PreferenceInflater.java:112)
        at android.support.v7.preference.PreferenceManager.inflateFromResource(PreferenceManager.java:138)
        at android.support.v7.preference.PreferenceFragmentCompat.addPreferencesFromResource(PreferenceFragmentCompat.java:432)
        at in.snotes.snotes.settings.PreferenceFragment.onCreatePreferences(PreferenceFragment.java:12)
        at android.support.v7.preference.PreferenceFragmentCompat.onCreate(PreferenceFragmentCompat.java:224)
        at android.support.v4.app.Fragment.performCreate(Fragment.java:2246)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1377)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1650)
        at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1906)
        at android.support.v4.app.FragmentManagerImpl.onCreateView(FragmentManager.java:3698)
        at android.support.v4.app.FragmentController.onCreateView(FragmentController.java:111)
        at android.support.v4.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:350)
        at android.support.v4.app.BaseFragmentActivityApi14.onCreateView(BaseFragmentActivityApi14.java:39)
        at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:67)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:777)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:727)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:858)
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:821)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:518)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:426)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:377)
02-21 22:23:36.575 8813-8813/in.snotes.snotes E/AndroidRuntime:     at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:287)
        at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:139)
        at in.snotes.snotes.settings.PreferenceActivity.onCreate(PreferenceActivity.java:21)
        at android.app.Activity.performCreate(Activity.java:6672)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1140)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2612)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2724)
        at android.app.ActivityThread.-wrap12(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1473)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6123)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)

我在编辑文本首选项之前有一个切换首选项并且效果很好。一旦我用编辑文本首选项替换了开关首选项,就会抛出此错误。

我该如何解决这个问题?

你能试试下面的代码吗?

strings.xml

<string name="pin_default_value">0000</string>

preference.xml

<EditTextPreference
    android:defaultValue="@string/pin_default_value"
    android:key="@string/pin"
    android:summary="Set Pin for Notes"
    android:title="Password" />

Android 正在尝试设置默认值,但它正在读取 0000 作为 Integer 而不是 String 主要原因是 android:defaultValue不直接处理为String。这样,为了避免这种 intString 的转换错误,您必须显式使用 String 值(通过使用 strings.xml.

中的一些字符串

备注

您可能需要清除您的应用数据,因为错误的默认值可能已经存储在缓存文件中。