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
- ¿Puedo desarrollar aplicaciones de Android sin IDE?
- "No se puede encontrar la base de datos de API; Comprobación de API no se realizó "en SDK de aplicaciones de Android con Eclipse
- Necesita un IDE para el desarrollo de Android NDK + SDK
- ¿Existen buenos tutoriales de Phonegap excepto para "Hola"?
- ¿Cómo vincular a Android Marketplace Review desde dentro de la aplicación?
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.
- Clase de carga basada en la versión de SDK
- ¿Cómo abro el explorador de archivos? (SDK de Android)
- cuáles son los paquetes que instalo desde sdk manager en android studio
- ERROR: La carpeta SWT '' no existe. Establezca ANDROID_SWT .. a Obtenga este error después de una actualización de SDK
- Google USB Package no se muestra en SDK Mananger
- Instalación de Android sdk. Error: Se encontró contenido no válido a partir del elemento 'd: skin'. No se espera ningún elemento hijo en este punto
- Android: permite la creación de un alias de actividad cuya targetActivity está en un aar / sdk
- Error al configurar SDK: Error: Módulo 'app': plataforma 'Google Inc.: API de Google: 21' no encontrado
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; }
- Acceder a la barra de acción desde dentro de un fragmento
- SecurityException: Permiso de denegación: abrir proveedor