5

Building multi-SDK Android apps in Eclipse without compile-time checks の質問に対する正しい答えのように見えるものについて、PT に感謝します。ただし、 @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 に示すように 2 つの構文エラーが生成されます。

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

示されているように、ステートメント@TargetApiの前または後に行があるかどうかに関係なく、エラーが存在します。@TargetApi() を正しく機能させるために、記事http://tools.android.com/recent/lintapicheckifに記載されていない前提条件 (インポート) またはその他の考慮事項はありますか?Lint API Check

--- 2012 年 9 月 3 日を編集 ---

@TargetApi アノテーションをクラス定義の前 (位置 1 として表示) またはメソッド定義の前 (位置 2 として表示、@Override アノテーションの前または後) に移動すると、さまざまなエラーが発生します。

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

--- 2012 年 9 月 4 日を編集 ---

完全なソースコードは次のとおりです。

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

}
4

3 に答える 3

9

FizzBu​​zz は、コンパイラの警告なしで Android のコードをどのようにバージョン管理しますか? でこれに対する答えを提供しました。.

コード内の注釈に加えて、@TargetApi(nn)その注釈の定義もインポートする必要があります。

import android.annotation.TargetApi;

なんらかの理由で、@Override注釈を使用するためにインポートは必要ありません。ADT のドキュメントhttp://tools.android.com/recent/lintapicheckが修正され、偽のコード例が削除され、必要なインポートについて言及されていると助かります。

于 2012-09-09T21:16:05.473 に答える
2

コードの途中で注釈を使用している Web サイトの例は、単純に間違っています (または古い可能性があります)。アノテーション自体の宣言は、型、メソッド、およびコンストラクターに対してのみ許可されていることを示しています。

/** 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();
}
于 2012-09-02T06:51:50.547 に答える
0

オーバーライド アノテーションのすぐ上にターゲット API アノテーションを挿入する

于 2012-09-01T23:38:54.967 に答える