【问题标题】:How to use preferences in Android support library v7 rev23?如何在 Android 支持库 v7 rev23 中使用首选项?
【发布时间】:2015-11-04 23:14:54
【问题描述】:

在我使用支持库 v7 的应用程序中,我想添加一个首选项屏幕。由于 Google 完全没有提供关于该主题的文档,因此我在 Stack Overflow 上的其他地方查找了一篇帖子。

这是我的项目:

activity_preferences.xml

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:support="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <include layout="@layout/toolbar_default"/>

    <fragment
        android:name=".FragmentPreferences"
        name=".FragmentPreferences"
        android:tag=".FragmentPreferences"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

ActivityPreferences.java

package com.example.testandroidsupportv7;

import com.example.testandroidsupportv7.R;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

public class ActivityPreferences extends AppCompatActivity
{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_preferences);
    }

}

FragmentPreferences.java

package com.example.testandroidsupportv7;

import com.example.testandroidsupportv7.R;
import android.os.Bundle;
import android.support.v7.preference.PreferenceFragmentCompat;

public class FragmentPreferences extends PreferenceFragmentCompat
{

    @Override
    public void onCreatePreferences(Bundle bundle, String s) {
        addPreferencesFromResource(R.xml.preferences);
    }

}

AndroidManifest.xml

<activity
        android:name=".ActivityPreferences"
        android:label="@string/app_name"
        android:theme="@style/MyTheme.NoActionBar" >
</activity>

xml/preferences.xml

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

    <android.support.v7.preference.PreferenceCategory
        android:title="Splošne nastavitve" >

        <android.support.v7.preference.CheckBoxPreference
            android:key="PREFERENCE_KEY_CHECK_BOX"
            android:defaultValue="false"
            android:summaryOff="Value is OFF."
            android:summaryOn="Value is ON."
            android:title="Check box preference" />

    </android.support.v7.preference.PreferenceCategory>

</android.support.v7.preference.PreferenceScreen>

如果我尝试启动此偏好活动,我会遇到异常。

logcat

FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.testandroidsupportv7/com.example.testandroidsupportv7.ActivityPreferences}: android.view.InflateException: Binary XML file line #11: Error inflating class fragment
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1651)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
    at android.app.ActivityThread.access$1500(ActivityThread.java:117)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:130)
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.testandroidsupportv7/com.example.testandroidsupportv7.ActivityPreferences}: android.view.InflateException: Binary XML file line #11: Error inflating class fragment
    at android.app.ActivityThread.main(ActivityThread.java:3691)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:507)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: android.view.InflateException: Binary XML file line #11: Error inflating class fragment
FATAL EXCEPTION: main
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:581)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:623)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:408)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
    at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:257)
    at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:109)
    at com.example.testandroidsupportv7.ActivityPreferences.onCreate(ActivityPreferences.java:13)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
    ... 11 more
Caused by: java.lang.ClassNotFoundException: android.view.fragment in loader dalvik.system.PathClassLoader[/data/app/com.example.testandroidsupportv7-2.apk]
    at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:240)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:551)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
    at android.view.LayoutInflater.createView(LayoutInflater.java:471)
    at android.view.LayoutInflater.onCreateView(LayoutInflater.java:549)
    at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:66)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:568)
    ... 20 more
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1651)

这段代码有什么问题?这应该有效。给出的例外令人费解并且没有提供任何线索。谷歌没有提供任何文档,也没有工作示例。我觉得可疑的是这条线:

引起:java.lang.ClassNotFoundException: android.view.fragment in 装载机 dalvik.system.PathClassLoader[/data/app/com.example.testandroidsupportv7-2.apk]

如何摆脱这个异常?

更新

我在 android 2.3.5 设备上运行。 我添加了preference.xml

【问题讨论】:

  • 可以在你的 activity_preferences.xml -- name=".FragmentPreferences"
  • @ianhanniballake 我已经读过这本书和很多其他的东西了。
  • 我刚刚注意到您正在扩展 appCompat Activity,您是否尝试过扩展 PreferenceActivity?参考这个例子,alvinalexander.com/android/…
  • AppCompatActivity 扩展了 android.support.v4.app.FragmentActivity,如果您想在偏好活动中使用工具栏,建议/必要。您所指的示例使用 android 5.0 并且不支持库。

标签: android android-support-library android-preferences android-appcompat


【解决方案1】:

您的 logcat 提示错误:XML file line #11: Error inflating class fragment - 可疑行似乎是 name=".FragmentPreferences",您可能想成为 android:name=".FragmentPreferences"。既然你已经有了,只需删除错误的行:)

<fragment
    android:name=".FragmentPreferences"
    android:tag=".FragmentPreferences"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

更新:如果这不起作用,那么另一个明显的错误是在 android:namevalue 中。应该是:

android:name="com.example.testandroidsupportv7.FragmentPreferences"

或任何您的 FragmentPreferences 类的实际路径。

我什至自己构建了您的项目,创建、测试和确认错误只用了不到 5 分钟;当我修复android:name 时,我得到了和你完全相同的错误,它构建得很好。截图:

我希望你为你的行为向所有人道歉......这不是如何从 SO 上的人那里获得帮助。

更新 2: 我构建的部分 logcat,带有错误的 android:name 值:

11-07 14:00:24.742 26456-26456/com.example.testandroidsupportv7 E/AndroidRuntime: FATAL EXCEPTION: main
11-07 14:00:24.742 26456-26456/com.example.testandroidsupportv7 E/AndroidRuntime: Process: com.example.testandroidsupportv7, PID: 26456
11-07 14:00:24.742 26456-26456/com.example.testandroidsupportv7 E/AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.testandroidsupportv7/com.example.testandroidsupportv7.ActivityPreferences}: android.view.InflateException: Binary XML file line #8: Error inflating class fragment
11-07 14:00:24.742 26456-26456/com.example.testandroidsupportv7 E/AndroidRuntime:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2345)
11-07 14:00:24.742 26456-26456/com.example.testandroidsupportv7 E/AndroidRuntime:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2405)
11-07 14:00:24.742 26456-26456/com.example.testandroidsupportv7 E/AndroidRuntime:     at android.app.ActivityThread.access$800(ActivityThread.java:155)
11-07 14:00:24.742 26456-26456/com.example.testandroidsupportv7 E/AndroidRuntime:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1323)
...
11-07 14:00:24.742 26456-26456/com.example.testandroidsupportv7 E/AndroidRuntime:   Suppressed: java.lang.ClassNotFoundException: Invalid name: .FragmentPreferences

依赖:

compile 'com.android.support:support-v4:23.1.0'
compile 'com.android.support:appcompat-v7:23.1.0'
compile 'com.android.support:preference-v7:23.1.0'
compile 'com.android.support:design:23.1.0'

请不要让我现在为你找一个 2.3.5 的设备来测试。

【讨论】:

  • 这不是一个低质量的猜测。您的 logcat 指示您的 xml 片段视图中有一个错误,并且该错误在哪里很明显;如果删除该行仍然会给您带来错误,那么您至少现在仍然知道在哪里继续查找。我很乐意帮助您了解您的 logcat 告诉您的内容,但我当然不会继续为您完成其余的工作。
  • 我已经尝试了我能想到的所有可能的组合。 andrind:name、name、class、android:class、短类名、完整类名、标签、android:tag 以及它们之间的所有组合。大约 60 种不同的尝试。他们每个人都需要时间。
  • 还有这个,希望对你有帮助:stackoverflow.com/questions/6424853/…
  • @f470071 不,我明白了......但关键是,对片段标签的两个修复会产生一个完美运行的应用程序(在 2 部手机和平板电脑上尝试过 - android 4.3, 5.0.2、5.1)。当我按原样离开 android:name 时,我得到了与您完全相同的 logcat 错误。如果您在执行两个修复后仍然无法运行您的应用程序,请再问一个问题,因为这里有比您的 OP 更多的东西。出于所有意图和目的,我的回答 100% 解决了您所询问的错误。
猜你喜欢
  • 2014-04-29
  • 2015-10-04
  • 1970-01-01
  • 1970-01-01
  • 2016-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多