【问题标题】:Runtime Exception in Preference Fragment首选项片段中的运行时异常
【发布时间】:2018-02-21 16:59:40
【问题描述】:

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

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)

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

我该如何解决这个问题?

【问题讨论】:

  • 你能告诉我你的 startActivity 代码吗?

标签: android preferencefragment


【解决方案1】:

你能试试下面的代码吗?

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 的一些字符串。

注意

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

【讨论】:

  • 您能否使用我建议的代码再次卸载并安装您的应用程序(或删除其数据)?由于您已经打开了应用程序,因此默认值可能已经写入缓存文件中...我在这里测试过,当我将值 0000 添加到 strings.xml 时它可以工作...
猜你喜欢
  • 2017-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多