2010-11-25 17 views
9

En Android tengo la versión del SDK fácilmente (Build.VERSION.SDK) pero necesito utilizar LabeledIntent sólo si la plataforma es más reciente que 1,6 (>Build.VERSION_CODES.DONUT)Android: cómo codificar según la versión de la API?

supongo que la reflexión es necesaria (He leído this link pero es no está claro para una clase o para mí).

Este es el código pero me da una excepción porque en mi Android 1.6, el compilador verifica si existe el paquete, aun cuando la condición no se aplica:

Intent theIntent=....; 
     if(Integer.parseInt(Build.VERSION.SDK) > Build.VERSION_CODES.DONUT) 
    {  
try{ 
      Intent intentChooser = Intent.createChooser(intent,"Choose between these programs"); 
       Parcelable[] parcelable = new Parcelable[1]; 
       parcelable[0] = new android.content.pm.LabeledIntent(theIntent, "", "Texto plano", 0); 
       intentChooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, parcelable); 
    activity.startActivity(intentChooser); 
    } 
    catch(Exception e) 
    { 
    activity.startActivity(theIntent); 
    } 

    } else 
    { 
    activity.startActivity(intentMedicamento); 
    } 

cómo resolví, algunos NOTAS A LA RESPUESTA CORRECTA

@Commonsware muéstrame la manera de hacerlo. Creamos una clase puente para que, dependiendo del nivel de API, ejecute una clase que use un nivel API u otra clase que use otro nivel API. El único detalle que un principiante podría olvidar es que tiene que compilar su aplicación con el último SDK que está listo para hacer referencia.

public abstract class LabeledIntentBridge { 
public abstract Intent BuildLabeledIntent(String URL, Intent theintent); 

public static final LabeledIntentBridge INSTANCE=buildBridge(); 

private static LabeledIntentBridge buildBridge() { 
    int sdk=new Integer(Build.VERSION.SDK).intValue(); 

    if (sdk<5) { 
    return(new LabeledIntentOld()); 
    } 

    return(new LabeledIntentNew()); 
} 
} 

Así que en el LabeledIntentNew, que incluía todo el código que se refiere a LabeledIntent sólo está disponible en nivel de la API 5. En LabeledIntentOld, puedo implementar otro tipo de control, en mi caso vuelvo la intención sí mismo sin hacer nada Más.

La llamada a esta clase se hace así:

LabeledIntentBridge.INSTANCE.BuildLabeledIntent(URLtest,theIntent); 
+0

¿Qué versión de marco está utilizando en su proyecto? – Flo

+0

@ Flo.- Mi AndroidManifest define minSdkVersion = "4". LabeledIntent solo está incluido en el SDK de API LEVEL 5 en. – netadictos

+0

Sí, pero ¿qué versión de framework está usando realmente en su proyecto? minSdkVersion es solo metainformación en el archivo de manifiesto. Cuando creó su proyecto, debería haber seleccionado una versión de marco en el cuadro de diálogo de creación. – Flo

Respuesta

2

siguen el patrón clase contenedora documented in the page you linked to above.

+0

No veo claramente. En el enlace utilizan el método Debug.class.getMethod(), ¿cuál sería el método para recuperar la clase LabeledIntent? Thx por proporcionar algún código. – netadictos

+0

@netadictos: Consulte https://github.com/commonsguy/cw-advandroid/tree/master/Contacts/Spinners/ para obtener otro enfoque sobre el problema. – CommonsWare

+0

me puede ayudar de otra manera en la forma de crear spinners, pero para hacer compatible el código que me indicas no compila para 1.6, porque cuando uso Android 1.6, no reconoce la clase android.provider.ContactsContract. ¿Debe ser compilado para 2.2 y funciona en teléfonos 1.6? – netadictos

1

Tienes que usar la reflexión ... La idea es buena, pero en tu código te refieres a LabeledIntent que no está disponible en 1.6. Entonces, cuando su aplicación se ejecuta contra 1.6 dispositivos, no puede encontrar la clase y falla.

Así que la idea es escribir código en el que no se refiera a LabeledIntent cuando se ejecuta en 1.6. Para hacer esto, puede escribir una clase contenedora (LabeledIntentWrapper) que extienda LabeledIntent y llamarla a su función. Entonces, en 1.6, el dispositivo verá una referencia a una clase conocida: LabeledIntentWrapper.

+0

el problema es que usa la referencia a LabeledIntent de todos modos. Por eso menciono la reflexión, es esencial, pero realmente no sé cómo implementarla porque tiene parámetros. – netadictos

Cuestiones relacionadas