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
.
- Cómo tratar las clases obsoletas en Android para mantener la compatibilidad
- ¿Por qué el teclado no se mostrará en Fragmento con WebView?
- GetSize () no es compatible con versiones anteriores de Android OS, getWidth () / getHeight () obsoleto
- ¿Cómo hacer que la función de notificación de respuesta directa de Android funcione en dispositivos pre-Android N?
- Inflar fragmentos con el paquete de compatibilidad android
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?
- Sustitución de fragmentos y cambio de orientación
- BackupAgent compatible con versiones anteriores
- ¿Cómo puedo usar el mismo conjunto de pantallas de preferencias para todas las versiones de Android de 2.X a 4.X?
- ¿Qué es la compatibilidad hacia atrás en Android Studio?
- ¿Honeycomb SDK rompió la compatibilidad con versiones anteriores de GridView?
- Android: menuItem.expandActionView () en el nivel API <14
- Inflar ActionBarSherlock Menú definido en XML
- Método alternativo a TextView.getMaxLines () para Android 4.0.3 (API 15) y inferior
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) } }
- Android Studio 2.1.1 utilizando pestañas, no espacios, aunque las pestañas no estén marcadas en Configuración
- Android checkable listview