Cuando isValidFragment () de android de PreferenceActivity se llama?

Para alguna aplicación en la que estaba trabajando, para dispositivos con nivel API 19, estoy recibiendo una excepción

Caused by: java.lang.RuntimeException: Subclasses of PreferenceActivity must override isValidFragment(String) to verify that the Fragment class is valid! com... has not checked if fragment com...$. is valid. 

Entonces, me enteré de que para esas aplicaciones android frameworks protected boolean isValidFragment(String fragmentName) se está llamando, que tiene código

 if (getApplicationInfo().targetSdkVersion >= android.os.Build.VERSION_CODES.KITKAT) { throw new RuntimeException( "Subclasses of PreferenceActivity must override isValidFragment(String)" + " to verify that the Fragment class is valid! " + this.getClass().getName() + " has not checked if fragment " + fragmentName + " is valid."); } else { return true; } 

Entonces intenté replicar el error

Tomé el código de mi ejemplo de aplicación del ejemplo de actividad de preferencias y añadí la línea <uses-sdk android:targetSdkVersion="19" /> en el manifiesto.

Pero extrañamente, no estoy recibiendo el error (isValidFragment () no se llama en ese caso).

Por favor, dime cómo replicar ese error en mi aplicación de ejemplo.

Parece ser un error o una restricción de seguridad 4.4. Workaraound es usar cualquier cosa debajo de 19 que sea compatible con PreferenceActivity y morder la bala para compilar con un objetivo más antiguo.

Estoy utilizando los encabezados "patrón" para la PreferenceActivity ( public void onBuildHeaders(List<Header> target) ), y asumo que el OP es demasiado probable que sea el lugar donde suceden cosas y se bloquea.

En mi caso, he reducido esta excepción a <uses-sdk android:targetSdkVersion="19" /> , y cualquier cosa en los objetivos de compilación [14-18] se compilará y se ejecutará sin problemas.

Sugerencia (para Eclipse): Nunca me he metido directamente con esas cosas, pero estoy asumiendo que compile su PreferenceActivity (y tal vez fragmentos) en un proyecto diferente, apuntando a 18 o menos (pun, no previsto: O), y luego usar Que se proyectan como una biblioteca para su proyecto principal dirigido a KitKat (19), tal vez pueda evitar el escenario de fallo en tiempo de ejecución mientras sigue utilizando las características que necesita desde la última generación (siempre y cuando esas características no estén en la compilación- 18-bound PreferenceActivity ). Si esto no tiene éxito, intente con ese proyecto en forma de jar (pre-compilado) en lugar de usar el proyecto como biblioteca.

ACTUALIZACIÓN : también tomar nota de la respuesta de Camille Sévigny. Si el problema tiene algo que ver con esa otra pregunta (50% de posibilidades IMHO), todas las aplicaciones que apuntan a la API 18 son vulnerables a ataques de inyección de fragmentos (consulte su pregunta vinculada).

La respuesta a su pregunta está en este post. Esta es una pregunta duplicada:

IsValidFragment Android API 19

–Actualizado–

Aquí está lo que la solución es:

Básicamente, cualquiera que sea la actividad que utilice su fragmento "com … $" en el error anterior, debe actualizarlo con la corrección siguiente. Debe actualizar todas las actividades de su proyecto con esta corrección para cualquier Acitvity que utilice un fragmento.

La documentación establece:

 protected boolean isValidFragment (String fragmentName) Added in API level 19 Subclasses should override this method and verify that the given fragment is a valid type to be attached to this activity. The default implementation returns true for apps built for android:targetSdkVersion older than KITKAT. For later versions, it will throw an exception. 

Puede corregir este error reemplazando este método a Activity / FragmentActivity:

 @Override protected boolean isValidFragment (String fragmentName) { return [YOUR_FRAGMENT_NAME_HERE].class.getName().equals(fragmentName); } 

Si estás siendo perezoso y sólo quieres probar si esta corrección funciona antes de codificar todos tus fragmentos en este método, simplemente puedes devolver true sin ninguna comprobación:

 @Override protected boolean isValidFragment (String fragmentName) { return true; } 

Tuve los mismos problemas al probar en el emulador y esta fue la solución.

¡Aqui tienes!

Golpea esto adentro, y eres bueno!

Recopile todas las clases internas que se encuentran en esta PreferenciaActividad. Elegí poner la lista en una variable de campo estático:

 public class whatever extends PreferenceActivity { static final Class<?>[] INNER_CLASSES = whatever.class.getDeclaredClasses(); 

A continuación, reemplace el método ValidFragment y asegúrese de que el fragmento que se va a mostrar sea uno de los que la actividad "principal" tiene en cuenta:

  /** * Google found a 'security vulnerability' and imposed this hack. * Have to check this fragment was actually conceived by this activity. */ @Override protected boolean isValidFragment(String fragmentName) { Boolean knownFrag = false; for (Class<?> cls : INNER_CLASSES) { if ( cls.getName().equals(fragmentName) ){ knownFrag = true; break; } } return knownFrag; } 
  • ¿Hay una penalización de rendimiento bajando la versión sdk
  • Android SDK r18 parece haber roto ORMLite
  • ¿Cómo desactivar mi servicio multimedia para una llamada entrante? Mi AudioManager no funciona
  • Android - obteniendo clave hash para la integración de Facebook
  • ¿Cómo utilizar complementos de Android SDK?
  • ¿Cómo instalar Android SDK Build Tools en la línea de comandos?
  • AssembleDebug error en Android Studio
  • Jerarquía Visor quiere un puerto reenviado, ¿cómo?
  • Error al analizar la salida de 'versión de adb'
  • SDK Manager no iniciará Windows 7 de 64 bits?
  • Error en Facebook sdk de Android durante el inicio de sesión
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.