11

Quiero usar la característica de barra de acciones incluida en SDK 11. Sin embargo, también quiero que la aplicación se ejecute en dispositivos anteriores desde SDK 10 (2.3.3). Estoy dispuesto a renunciar a la función de la barra de acciones para los dispositivos anteriores, ya que no es una característica importante. He realizado todas las lecturas sobre reflexión, clase contenedora y algunas otras técnicas. Ahora estoy perplejo sobre exactamente cómo hacer que esto funcione. Estoy usando Eclipse.¿Cómo codificar la nueva característica compatible con versiones anteriores en Android SDK?

Si no configuro el objetivo en Eclipse en sdk 11 o superior, entonces cualquier lugar que tenga una referencia a actionBar arroja un error de compilación. Si pongo el objetivo en sdk 11 o superior, compila pero no mostrará que puede ejecutarse en dispositivos anteriores. Tengo android:minSdkVersion=10 establecido todo el tiempo.

¿Alguien me puede dar alguna información sobre cómo hacer las referencias a actionBar y aún lograr que apunte a un nivel sdk anterior? Gracias por adelantado.

Respuesta

18

Sí! Definitivamente puedes hacer esto. Intenta seguir el patrón que se detalla a continuación.

En el archivo AndroidManifest.xml declarar lo siguiente (en sustitución de las versiones de la plataforma, con lo que su aplicación requiere):

<!-- Build Target --> 
<uses-sdk android:targetSdkVersion="14" android:minSdkVersion="7" /> 

Al dirigirse a una versión de la plataforma de API de 11 o superior, que están permitiendo Eclipse para enlazar (compilar) contra las clases nativas de ActionBar. Proporcionar una versión de plataforma mínima anterior permite que su aplicación se instale (ejecute) en versiones anteriores de Android.

Su Código de actividad debería entonces ser algo como esto:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    if (CompatibilityManager.isHoneycomb()) { 
     final ActionBar actionBar = getActionBar(); 
     actionBar.setDisplayShowHomeEnabled(true); 
     // ... 
    } else { 
     // The ActionBar is unavailable! 
     // ... 
    } 
} 

donde la clase CompatibilityManager.java simplemente proporciona métodos estáticos de ayuda para determinar la versión actual del SDK:

public class CompatibilityManager { 
    public static final String KINDLE_FIRE_MODEL = "Kindle Fire"; 

    /** 
    * Get the current Android API level. 
    */ 
    public static int getSdkVersion() { 
     return android.os.Build.VERSION.SDK_INT; 
    } 

    /** 
    * Determine if the device is running API level 11 or higher. 
    */ 
    public static boolean isHoneycomb() { 
     return getSdkVersion() >= Build.VERSION_CODES.HONEYCOMB; 
    } 

    /** 
    * Determine if the device is running API level 14 or higher. 
    */ 
    public static boolean isIceCreamSandwich() { 
     return getSdkVersion() >= Build.VERSION_CODES.ICE_CREAM_SANDWICH; 
    } 

    /** 
    * Determine if the current device is a first generation Kindle Fire. 
    * @return true if the device model is equal to "Kindle Fire", false if otherwise. 
    */ 
    public static boolean isKindleFire() { 
     return Build.MODEL.equals(KINDLE_FIRE_MODEL); 
    } 
} 

También puede considerar aprovechando la biblioteca ActionBarSherlock, que proporciona una API de ActionBar compatible desde la versión 2.x de Android:

La biblioteca utilizará automáticamente la barra de acciones nativas cuando esté disponible o automáticamente ajustará una implementación personalizada alrededor de sus diseños. Esto le permite desarrollar fácilmente una aplicación con una barra de acción para cada versión de Android hasta 2.x.

Have fun!

+1

Puede encontrar más documentación sobre la compatibilidad hacia atrás en general en http://developer.android.com/resources/articles/backward-compatibility.html La documentación de la barra de acciones también cubre esto y cómo usarlo en una forma básica y aún ser compatible con versiones anteriores. http://developer.android.com/guide/topics/ui/actionbar.html#Adding – cistearns

+0

Ok, hice una codificación similar. Voy a intentar tu sugerencia también. El problema que encontré fue que cuando intenté ejecutar la aplicación y apareció el emulador (en eclipse), solo aparecieron los dispositivos de nivel objetivo. Finalmente utilicé el administrador de AVD para iniciar el dispositivo de nivel inferior y luego lo usé específicamente mientras se estaba ejecutando. Elijo no usar ActionBarSherlock ya que solo quiero la función en nuevos dispositivos por el momento. Podría cambiar de opinión más tarde. Gracias. –

+2

Después de cambiar el objetivo de compilación y la versión mínima en el archivo AndroidManifest.xml, es posible que necesite decirle a Eclipse que se modificó el objetivo de compilación. Para hacerlo, puede hacer clic derecho en su proyecto y seleccionar 'Propiedades'.A continuación, seleccione 'Android' en el menú de la izquierda y asegúrese de que el objetivo que se marca es igual al especificado en su manifiesto. Todo lo que hace es actualizar el archivo de construcción 'project.properties' en el directorio raíz de su proyecto. – twaddington

Cuestiones relacionadas