2

我想從v7支持庫中使用PreferenceFragmentCompat。當我嘗試添加它時,它始終返回以下例外PreferenceFragmentCompat不會加載在AppCompatPreferenceActivity - 試圖實例化一個類不是片段

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.access$1000(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)方法現在已被棄用,並且較早的設備未附加我的接口。

這是類

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) { 
     } 
    } 
} 

頁眉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> 

搖籃

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,如果不是這樣?

+0

'onAttach(Activity activity)'已棄用。使用onAttach(上下文上下文)'。在這兩種情況下工作 – piotrek1543

回答

4

發生此問題,因爲框架片段和支持片段不兼容。如果您使用的支持庫樣本中的AppCompatPreferenceActivity,則使用帶有工具欄支持的正常PreferenceActivity。那裏不支持支持片段。這就是爲什麼PreferenceFragment工作正常,PreferenceFragmentCompat沒有。

如果您只關注onAttach(Activity)被棄用,請不要。當連接到活動時,onAttach(Context)的默認實現只是調用它。因此,僅安裝onAttach(Activity)才能與所有當前版本的Android兼容。

+0

如何使用PreferenceFragmentCompat和AppCompatPreferenceActivity加載頭文件'onBuildHeaders'? – Andreyua

+0

@Andreyua如果是「AppCompatPreferenceActivity」示例,則不能。 – tynn

+0

沒有'AppCompatPreferenceActivity',但有'PreferenceFragmentCompat'? – Andreyua

-1

爲編譯 'com.android.support:preference-v14:24.1.1' 到搖籃和使用的

android.support.v14.preference.PreferenceFragment 

代替

android.support.v7.preference.PreferenceFragmentCompat. 

這解決了這個問題對我來說。