2012-09-01 9 views
5

Dank P.T. für was wie die richtige Antwort auf Frage Building multi-SDK Android apps in Eclipse without losing compile-time checks aussieht. Wenn ich jedoch versuche, die @TargetApi() - Annotation wie empfohlen zu verwenden, werden Syntaxfehler generiert.Android Eclipse Lint API überprüft

@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); } 

erzeugt zwei Syntaxfehler auf der @TargetApi Linie, wenn es in der Mitte des Codes ist als 3 an der Stelle gezeigt:

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

Die Fehler existieren, ob ich die @TargetApi Zeile vor der if haben Anweisung oder danach wie gezeigt. Gibt es irgendwelche Voraussetzungen (Importe) oder andere Überlegungen, die nicht in dem Artikel Lint API Check Artikel http://tools.android.com/recent/lintapicheck erwähnt werden, um @TargetApi() richtig zu funktionieren?

--- --- Bearbeiten 2012.09.03

Wenn ich die @TargetApi Annotation vor der Klassendefinition (gezeigt als Position 1) oder vor der Methodendefinition (gezeigt als Position 2 entweder bewegen vor oder nach der @Override Anmerkung), erhalte ich unterschiedliche Fehler:

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

--- bearbeiten 2012.09.04 ---

Hier ist der vollständige Quellcode:

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); 
    } 

} 

Antwort

9

FizzBuzz die Antwort auf diese in How do you version code in Android without compiler warnings? zur Verfügung gestellt.

Neben der @TargetApi(nn) Anmerkung im Code, müssen Sie auch die Definition dieser Anmerkung importieren:

import android.annotation.TargetApi; 

Aus unbekannten Gründen ist ein Import nicht die @Override Anmerkung zu verwenden, erforderlich. Es wäre hilfreich, wenn die ADT-Dokumentation http://tools.android.com/recent/lintapicheck behoben würde, um das gefälschte Code-Beispiel zu eliminieren und den erforderlichen Import zu erwähnen.

0

Einfügen Ziel API Anmerkung nur über Überschreibung Anmerkung

+0

Danke, versuchte es aber immer noch nicht für mich arbeiten. – Dave

+0

können Sie den gesamten Code posten, nicht nur diesen Teil. Welche ADT-Version verwenden Sie? – nandeesh

+0

Eclipse für Mobile Juno Build-ID: 20120614-1722, Android-Entwicklungstools 20.0.3.v201208082019-427395. – Dave

2

Das Beispiel auf der Website die Anmerkung in der Mitte des Code ist einfach falsch (oder vielleicht veraltet). Die Erklärung der Anmerkung selbst zeigt, dass es nur für types, methods and constructors erlaubt ist:

/** 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

Danke - Ich versuche, es auf eine Methode zu verwenden, wenn Sie an Position 2 platziert, aber ich kann es immer noch nicht funktionieren. Ich habe Min SDK Version 11 im Manifest festgelegt, um den Code zu kompilieren, aber ich möchte immer noch herausfinden, wie TargetApi mit Min SDK Version 8 funktioniert. Ihr Code-Beispiel sagt @ Target, nicht @ TargetApi - ist das von Bedeutung? Ich bekomme die gleichen Fehler ("Syntaxfehler", wenn es im Code ist, "kann nicht aufgelöst werden", wenn es vor der Methode ist), ob ich @ Target (11) oder @ TargetApi (11) verwende. – Dave

+0

Dies ist der Quellcode der TargetApi-Annotation _itself_ in Android, der nicht in Ihrem Java-Code verwendet werden soll.Und es zeigt nur, dass Sie die TargetApi Annotation nur mit dem Typ _declarations_, method _declarations_ oder constructor _declarations_ verwenden können. Die TargetApi Annotation ist daher in der Mitte eines Codeblocks nicht erlaubt, egal wie Sie es versuchen. – Bananeweizen

Verwandte Themen