【发布时间】: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