2011-07-31 19 views
6

Estoy trabajando en una aplicación que apunta a API 11 (3.0) pero minSDKVersion es 7 (2.1).Es necesario reflexionar si utilizo "if (android.os.Build.VERSION.SDK_INT> = 11)"

Genero mi PreferenceActivity programáticamente en lugar de XML. En Honeycomb, los diseños de preferencias tienen un lugar integrado para un icono que puede ir junto a cada preferencia. Puede configurarlo con prefScreen.setIcon(R.drawable.my_icon);

Así que no quiero hacer esto en API 7-10. ¿Es esto suficiente protección contra los bloqueos?

if (android.os.Build.VERSION.SDK_INT>=11) 
    prefScreen.setIcon(R.drawable.myIcon); 

La solución más elaborada que sé que es seguro es utilizar la reflexión para comprobar si existe ese método antes de intentar usarlo.

Respuesta

10

Según http://developer.android.com/training/basics/activity-lifecycle/starting.html, se da a entender que es seguro utilizar la constante SDK_INT en Android 2.0 y superior para envolver las llamadas a las API más nuevos, sin necesidad de utilizar la reflexión.

Precaución: El uso del SDK_INT para prevenir antiguo sistema de ejecución de nuevas API funciona de esta manera en Android 2.0 (API de nivel 5) y superior solamente. Las versiones anteriores encontrarán una excepción de tiempo de ejecución.

+2

Disculpe si es mala forma volver dos años después y cambiar la respuesta aceptada, pero esta respuesta es ahora la correcta. Lint proporciona advertencias para evitar cometer un error al llamar a métodos no disponibles. – Tenfour04

1

Si el método no está disponible en una versión inferior de la plataforma, que se colgará cuando el archivo se carga por el sistema (que ni siquiera lo hará a su estado de ejecución de if)

Usted debe ver el artículo sobre Lazy Loading hacer la reflexión sobre la Android Dev Blog

+0

No es cierto ... esto está funcionando bien en mi teléfono con 2.2. Simplemente no estoy seguro de si es 100% seguro. Veré la carga floja, gracias. – Tenfour04

+0

Interesante, tenía la impresión de que todos los métodos se validaron cuando la clase se cargó por primera vez y evitaría que ese tipo de declaraciones 'if' funcione. De cualquier forma, Lazy Loading es la mejor forma de manejar este tipo de ambigüedades cuando se trata de versiones de plataformas más antiguas. – smith324

+0

Sí, después de leer un poco más sobre él, parece que debería haberse bloqueado al cargar la clase. No estoy seguro de por qué no lo hizo. – Tenfour04

2

Esto funcionó para mí:

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB){ 
      //code 
} 
Cuestiones relacionadas