Android: Solución para support.v4.app.Fragment -> Fragment classcastexception?

Estoy intentando agregar un support.v4.app.Fragment a un encabezado de PreferenceActivity , así:

 <header android:fragment="com.example.SupportFragmentSubClass" android:title="Selecting this should show the accompanying fragment" > </header> 

Esto lanza una ClassCastException, presumiblemente porque PreferenceActivity está esperando una subclase de android.app.Fragment , en lugar de support.v4.app.Fragment .

Mi caso de uso es este:
Tengo un fragmento no estándar que quiero usar como una preferencia en dispositivos <3.0 y> 3.0. Para> = 3.0, necesito una subclase android.app.Fragment para que pueda incrustarse en el "panel de detalles" de la actividad de preferencias en los dispositivos de la tableta. Para <3.0, necesito una subclase v4.support.app.Fragment para poder lanzarla en un ActivityFragment .

¿Hay una solución que me permita utilizar un fragmento de compatibilidad en esta situación?

PreferenceFragment no está en el paquete de soporte de Android, y no puedes usar un paquete de soporte de Android Fragment en una clase PreferenceActivity esta manera. Por otra parte, sus encabezados no funcionaría en Android 2.x de todos modos, ya que el PreferenceActivity en Android 2.x no sabe sobre los fragmentos.

En principio, podría bifurcar la PreferenceActivity del código fuente para crear una que utilice la versión de soporte de Android de Fragment .

O bien, organice sus preferencias para usar fragmentos en Android 3.0 y evítelos en Android 2.x. Aquí hay un ejemplo de proyecto en el que demuestro una manera de hacerlo.

Como señala @CommonsWare, no es posible lo que quería sin volver a escribir PreferenceActivity, y eso parece una carga de trabajo.

La solución no tan elegante que me decidí a crear dos PreferenceActivities ( como se muestra aquí ) y también crear dos subgrupos Fragmento, uno para cada sabor de Fragmento.

Por lo tanto, PrefsActivityHC añade este encabezado:

 <header <!-- An android.app.Fragment subclass --> android:fragment="com.example.project.MyFragmentHC" </header> 

… mientras que PrefsActivity agrega esta preferencia:

 <Preference> <intent <!-- A v4.support.app.Fragment subclass, wrapped in an ActivityFragment --> android:targetClass="com.example.project.MyFragmentActivity" android:targetPackage="com.example.project" > </intent> </Preference> 

Para minimizar la cantidad de duplicación de código necesaria para tener dos fragmentos casi idénticos, he creado una clase MyFragmentDelegate que admite métodos de fragmento comunes y mantuvo una instancia de eso en MyFragment y MyFragmentHC . Las llamadas a los métodos de estos fragmentos son simplemente enviadas al delegado:

 class MyFragment { MyFragmentDelegate mDelegate; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return mDelegate.onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) } } class MyFragmentHC { MyFragmentDelegate mDelegate; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return mDelegate.onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) } } 
  • SDK 19 y siguientes no reconoce android.support.v7.widget.CardView, Error al inflar la clase <unknown>
  • Inflar fragmentos con el paquete de compatibilidad android
  • ¿Honeycomb SDK rompió la compatibilidad con versiones anteriores de GridView?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.