2012-09-01 11 views
5

Gracias P.T. para lo que parece ser la respuesta correcta a la pregunta Building multi-SDK Android apps in Eclipse without losing compile-time checks. Sin embargo, cuando intento utilizar la anotación @TargetApi() como se recomienda, genera errores de sintaxis.Android Eclipse Lint API comprueba

@TargetApi(11) // location 1 
public class DisplayMessageActivity extends Activity { 

    @Override 
    @TargetApi(11) // location 2 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
      @TargetApi(11) // location 3 
      getActionBar().setDisplayHomeAsUpEnabled(true); } 

genera dos errores de sintaxis en la línea @TargetApi cuando está en el medio del código como se muestra en la posición 3:

x Syntax error, insert "enum Identifier" to complete EnumHeaderName 
x Syntax error, insert "enumBody" to complete BlockStatements 

existir Los errores si tengo la línea @TargetApi antes de la if declaración o después de ella como se muestra. ¿Existen requisitos previos (importaciones) u otras consideraciones no mencionadas en el artículo Lint API Checkhttp://tools.android.com/recent/lintapicheck para que @TargetApi() funcione correctamente?

--- Editar 9/3/2012 ---

Si muevo la anotación @TargetApi a antes de la definición de clase (que se muestra como la ubicación 1) o antes de la definición del método (que se muestra como la ubicación 2, ya sea antes o después de la anotación @ Override), consigo diferentes errores:

x TargetApi cannot be resolved to a type 
x The attribute value is undefined for the annotation type TargetApi 

--- --- 9/4/2012 Edición

Aquí está el código fuente completo:

package com.example.my.first.app; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Build; 
import android.os.Bundle; 
import android.support.v4.app.NavUtils; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.TextView; 

public class DisplayMessageActivity extends Activity { 

    @TargetApi(11) 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // ActionBar introduced in Android 3.0 Honeycomb API 11 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
      getActionBar().setDisplayHomeAsUpEnabled(true); } // Up Navigation 

     // Get the message from the intent 
     Intent intent = getIntent(); 
     String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE); 

     // Create the text view 
     TextView textView = new TextView(this); 
     textView.setTextSize(40); 
     textView.setText(message); 

     // Set the text view as the activity layout 
     setContentView(textView); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.activity_display_message, menu); 
     return true; 
    } 


    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case android.R.id.home: 
       NavUtils.navigateUpFromSameTask(this); 
       return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

} 

Respuesta

9

FizzBuzz proporcionan la respuesta a esto en How do you version code in Android without compiler warnings?.

Además de la @TargetApi(nn) anotación en el código, también es necesario importar la definición de esa anotación:

import android.annotation.TargetApi; 

Por alguna razón desconocida, no se requiere una importación de usar la anotación @Override. Sería útil si se corrigió la documentación de ADT http://tools.android.com/recent/lintapicheck para eliminar el ejemplo de código falso y mencionar la importación requerida.

0

Insertar API objetivo de anotación justo por encima de la anotación de anulación

+0

Gracias, lo probé pero todavía no funciona para mí. – Dave

+0

puede publicar el código completo, no solo esta parte. ¿Qué versión de ADT estás usando? – nandeesh

+0

Eclipse para móvil ID de compilación de Juno: 20120614-1722, herramientas de desarrollo de Android 20.0.3.v201208082019-427395. – Dave

2

El ejemplo de la página web mediante la anotación en el medio del código es simplemente errónea (o tal vez obsoleta). La declaración de la propia anotación muestra que sólo se permite para types, methods and constructors:

/** Indicates that Lint should treat this type as targeting a given API level, no matter what the 
    project target is. */ 
@Target({TYPE, METHOD, CONSTRUCTOR}) 
@Retention(RetentionPolicy.CLASS) 
public @interface TargetApi { 
    /** 
    * This sets the target api level for the type.. 
    */ 
    int value(); 
} 
+0

Gracias - Estoy intentando usarlo en un método cuando lo coloco en la ubicación 2, pero todavía no puedo hacer que funcione. Establecí la versión 11 de Min SDK en el manifiesto para obtener el código para compilar, pero igual quiero saber cómo hacer que TargetApi trabaje con Min SDK versión 8. La muestra de tu código dice @ Target, not @ TargetApi - es eso ¿significativo? Obtengo los mismos errores ("error de sintaxis" cuando está en el código, "no se puede resolver" cuando está antes del método) si utilizo @ Target (11) o @ TargetApi (11). – Dave

+0

Este es el código fuente de la anotación TargetApi _itself_ en Android, no debe usarse en su código Java.Y solo muestra que solo puede usar la anotación TargetApi en tipo _declarations_, method _declarations_ o constructor _declarations_. Por lo tanto, la anotación TargetApi no está permitida en medio de un bloque de código. – Bananeweizen