Проверки API Android Eclipse Lint

Спасибо PT за то, что похоже на правильный ответ на вопрос. Создание приложений с несколькими SDK для Android в Eclipse без потери времени проверки . Однако, когда я пытаюсь использовать аннотацию @TargetApi (), как рекомендовано, она генерирует синтаксические ошибки.

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

Генерирует две синтаксические ошибки в строке @TargetApi, когда она находится в середине кода, как показано в позиции 3:

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

Ошибки существуют, есть @TargetApi строка @TargetApi перед оператором if или после нее, как показано. Существуют ли какие-либо предварительные условия (импорт) или другие соображения, не упомянутые в Lint API Check статью http://tools.android.com/recent/lintapicheck, чтобы получить работу @TargetApi () правильно?

— Редактировать 9/3/2012 —

Если я перемещаю аннотацию @TargetApi до определения класса (показано как местоположение 1) или до определения метода (показано как местоположение 2, до или после аннотации @Override), я получаю разные ошибки:

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

— Редактировать 9/4/2012 —

Вот полный исходный код:

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

FizzBuzz предоставил ответ на этот вопрос: Как вы используете код версии в Android без предупреждений компилятора? ,

В дополнение к аннотации @TargetApi(nn) в коде вам также необходимо импортировать определение этой аннотации:

 import android.annotation.TargetApi; 

По какой-то неизвестной причине импорт не требуется для использования аннотации @Override . Было бы полезно, если бы документация ADT http://tools.android.com/recent/lintapicheck была исправлена, чтобы исключить пример фиктивного кода и указать требуемый импорт.

Пример на веб-сайте с использованием аннотации в середине кода просто неправильный (или, может быть, устаревший). Объявление самой аннотации показывает, что это разрешено только для типов, методов и конструкторов :

 /** 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(); } 

Вставить аннотацию целевого API чуть выше переопределенной аннотации