2

Ich versuche PreferenceFragmentCompat von der v7 Support-Bibliothek zu verwenden. Wenn ich versuche, es zu schreiben, gibt es immer die folgende AusnahmePreferenceFragmentCompat nicht in AppCompatPreferenceActivity laden - Der Versuch, eine Klasse zu instanziieren, das kein Fragment ist

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) 

Wenn ich versuche, einen PreferenceFragment mit diesem zu verwenden, funktioniert alles einwandfrei. Wenn ich versuche, PreferenceFragmentCompat zu verwenden, schlägt der Fehler fehl

Der Grund, warum ich dies verwenden möchte, ist, weil die Methode onAttach (Activity) jetzt veraltet ist und frühere Geräte meine Schnittstelle nicht anschlossen.

Dies ist die Klasse

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

Header 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' 
} 

Wie soll ich das PreferenceFragmentCompat verwenden soll, wenn sie nicht auf diese Weise?

+0

'onAttach (Aktivität Aktivität)' ist veraltet. Verwenden Sie stattdessen 'onAttach (Kontextkontext)'. Arbeiten in beiden Fällen – piotrek1543

Antwort

4

Dieses Problem tritt auf, weil Rahmenfragmente und Fragmente Unterstützung nicht kompatibel sind. Wenn Sie die AppCompatPreferenceActivity aus den Proben der Support-Bibliothek verwenden, verwenden Sie eine normale PreferenceActivity mit Symbolleiste Unterstützung. Supportfragmente werden dort nicht unterstützt. Deshalb funktioniert PreferenceFragment gut und PreferenceFragmentCompat nicht.

Wenn Sie nur besorgt über onAttach(Activity) veraltet ist, nicht sein. Die Standardimplementierung von onAttach(Context) ruft nur an, wenn sie an eine Aktivität angehängt ist. Daher ist es sicher, nur onAttach(Activity) zu implementieren, um mit allen aktuellen Versionen von Android kompatibel zu sein.

+0

Wie Last Header 'onBuildHeaders' mit PreferenceFragmentCompat und AppCompatPreferenceActivity? – Andreyua

+0

@Andreyua Wenn es das Beispiel 'AppCompatPreferenceActivity' ist, können Sie nicht. – tynn

+0

ohne 'AppCompatPreferenceActivity', aber mit' PreferenceFragmentCompat'? – Andreyua

-1

Add Kompilierung 'com.android.support:preference-v14:24.1.1' Gradle und

android.support.v14.preference.PreferenceFragment 

statt für mich

android.support.v7.preference.PreferenceFragmentCompat. 

Dies löste das Problem zu verwenden.

Verwandte Themen