偏好片段中的运行时异常

时间:2018-02-21 16:59:40

标签: android preferencefragment

我有一个带有以下文件的首选项片段

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>

偏好活动

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)

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

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

你能试试下面的代码吗?

<强>的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正在尝试设置默认值,但是0000Integer,而不是String主要原因是android:defaultValue未直接处理为String {1}}。这样,为避免此intString转换错误,您必须明确使用String值(使用strings.xml中的某些字符串。

注意

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