PreferenceFragmentCompat 不会在 AppCompatPreferenceActivity 中加载 - 尝试实例化不是片段的 class
PreferenceFragmentCompat won't load in AppCompatPreferenceActivity - Trying to instantiate a class that is not a Fragment
我正在尝试使用 v7 支持库中的 PreferenceFragmentCompat。当我尝试添加它时,它总是 returns 以下异常
Process: com.sample.preferencetest, PID: 14444
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.sample.preferencetest/com.sample.preferencetest.SettingsActivity}: android.app.Fragment$InstantiationException: Trying to instantiate a class com.sample.preferencetest.SettingsActivity$EmptyFragment that is not a Fragment
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3155)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3263)
at android.app.ActivityThread.access00(ActivityThread.java:197)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1687)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:6897)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
当我尝试对此使用 PreferenceFragment 时,一切正常。只有当我尝试使用 PreferenceFragmentCompat 时它才会失败
我想使用它的原因是 onAttach(Activity) 方法现在已被弃用,并且早期的设备没有附加我的接口。
这是class
package com.sample.preferencetest;
import android.os.Bundle;
//import android.preference.PreferenceFragment; I toggle this to try regular preference fragments.
import android.support.v7.preference.PreferenceFragmentCompat;
import java.util.List;
public class SettingsActivity extends AppCompatPreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void onBuildHeaders(List<Header> target) {
loadHeadersFromResource(R.xml.pref_headers, target);
}
protected boolean isValidFragment(String fragmentName) {
return true;
}
public static class EmptyFragment extends PreferenceFragmentCompat {
public EmptyFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void onCreatePreferences(Bundle bundle, String s) {
}
}
}
Headers XML
<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
<header
android:fragment="com.sample.preferencetest.SettingsActivity$EmptyFragment"
android:icon="@drawable/ic_info_black_24dp"
android:title="@string/pref_header_general" />
</preference-headers>
Gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
applicationId "com.sample.preferencetest"
minSdkVersion 16
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.2.1'
compile 'com.android.support:design:23.2.1'
compile 'com.android.support:support-v4:23.2.1'
compile 'com.android.support:preference-v7:23.3.0'
}
如果不是这样,我该如何使用 PreferenceFragmentCompat?
出现这个问题是因为框架片段和支持片段不兼容。如果您使用支持库示例中的 AppCompatPreferenceActivity
,则您使用的是带有工具栏支持的普通 PreferenceActivity
。那里不支持支持片段。这就是 PreferenceFragment
工作正常而 PreferenceFragmentCompat
不工作的原因。
如果您只担心 onAttach(Activity)
被弃用,请不要担心。 onAttach(Context)
的默认实现只是在附加到活动时调用它。因此,仅实现 onAttach(Activity)
以与 Android.
的所有当前版本兼容是安全的
将编译'com.android.support:preference-v14:24.1.1'添加到gradle并使用
android.support.v14.preference.PreferenceFragment
而不是
android.support.v7.preference.PreferenceFragmentCompat.
这解决了我的问题。
我正在尝试使用 v7 支持库中的 PreferenceFragmentCompat。当我尝试添加它时,它总是 returns 以下异常
Process: com.sample.preferencetest, PID: 14444
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.sample.preferencetest/com.sample.preferencetest.SettingsActivity}: android.app.Fragment$InstantiationException: Trying to instantiate a class com.sample.preferencetest.SettingsActivity$EmptyFragment that is not a Fragment
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3155)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3263)
at android.app.ActivityThread.access00(ActivityThread.java:197)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1687)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:6897)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
当我尝试对此使用 PreferenceFragment 时,一切正常。只有当我尝试使用 PreferenceFragmentCompat 时它才会失败
我想使用它的原因是 onAttach(Activity) 方法现在已被弃用,并且早期的设备没有附加我的接口。
这是class
package com.sample.preferencetest;
import android.os.Bundle;
//import android.preference.PreferenceFragment; I toggle this to try regular preference fragments.
import android.support.v7.preference.PreferenceFragmentCompat;
import java.util.List;
public class SettingsActivity extends AppCompatPreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void onBuildHeaders(List<Header> target) {
loadHeadersFromResource(R.xml.pref_headers, target);
}
protected boolean isValidFragment(String fragmentName) {
return true;
}
public static class EmptyFragment extends PreferenceFragmentCompat {
public EmptyFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void onCreatePreferences(Bundle bundle, String s) {
}
}
}
Headers XML
<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
<header
android:fragment="com.sample.preferencetest.SettingsActivity$EmptyFragment"
android:icon="@drawable/ic_info_black_24dp"
android:title="@string/pref_header_general" />
</preference-headers>
Gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
applicationId "com.sample.preferencetest"
minSdkVersion 16
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.2.1'
compile 'com.android.support:design:23.2.1'
compile 'com.android.support:support-v4:23.2.1'
compile 'com.android.support:preference-v7:23.3.0'
}
如果不是这样,我该如何使用 PreferenceFragmentCompat?
出现这个问题是因为框架片段和支持片段不兼容。如果您使用支持库示例中的 AppCompatPreferenceActivity
,则您使用的是带有工具栏支持的普通 PreferenceActivity
。那里不支持支持片段。这就是 PreferenceFragment
工作正常而 PreferenceFragmentCompat
不工作的原因。
如果您只担心 onAttach(Activity)
被弃用,请不要担心。 onAttach(Context)
的默认实现只是在附加到活动时调用它。因此,仅实现 onAttach(Activity)
以与 Android.
将编译'com.android.support:preference-v14:24.1.1'添加到gradle并使用
android.support.v14.preference.PreferenceFragment
而不是
android.support.v7.preference.PreferenceFragmentCompat.
这解决了我的问题。