2012-09-01 27 views
5

Cảm ơn P.T. cho câu trả lời đúng cho câu hỏi Building multi-SDK Android apps in Eclipse without losing compile-time checks. Tuy nhiên, khi tôi cố gắng sử dụng chú thích @TargetApi() như được đề xuất, nó sẽ tạo ra các lỗi cú pháp.Kiểm tra API Lint Eclipse của Android

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

tạo ra hai lỗi cú pháp trên dòng @TargetApi khi nó đang ở giữa của mã như hiển thị ở vị trí 3:

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

Các lỗi tồn tại cho dù tôi có dòng @TargetApi trước if tuyên bố hoặc sau khi nó được hiển thị. Có bất kỳ điều kiện tiên quyết (nhập khẩu) hoặc cân nhắc khác không được đề cập trong bài viết Lint API Checkhttp://tools.android.com/recent/lintapicheck để nhận @TargetApi() hoạt động chính xác không?

--- Sửa 2012/09/03 ---

Nếu tôi di chuyển chú thích @TargetApi tới trước khi định nghĩa lớp (hiển thị như vị trí 1) hoặc trước khi định nghĩa phương pháp (hiển thị như vị trí 2, hoặc trước hoặc sau khi chú thích @ Override), tôi nhận được lỗi khác nhau:

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

--- Sửa 2012/09/04 ---

đây là mã nguồn đầy đủ:

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

} 

Trả lời

9

FizzBuzz cung cấp câu trả lời cho điều này trong How do you version code in Android without compiler warnings?.

Ngoài các @TargetApi(nn) chú thích trong mã này, bạn cũng cần phải nhập khẩu các định nghĩa của chú thích rằng:

import android.annotation.TargetApi; 

Đối với một số lý do không rõ, một nhập khẩu không cần phải sử dụng @Override chú thích. Sẽ hữu ích nếu tài liệu ADT http://tools.android.com/recent/lintapicheck được cố định để loại bỏ ví dụ mã không có thật và đề cập đến yêu cầu nhập.

0

Chèn chú thích API mục tiêu ngay trên ghi đè chú thích

+0

Cảm ơn, đã thử nhưng vẫn không hoạt động đối với tôi. – Dave

+0

bạn có thể đăng toàn bộ mã, không chỉ phần này. Bạn đang sử dụng phiên bản ADT nào? – nandeesh

+0

Eclipse cho Id xây dựng Juno dành cho thiết bị di động: 20120614-1722, công cụ phát triển Android 20.0.3.v201208082019-427395. – Dave

2

Ví dụ trên trang web bằng cách sử dụng chú thích ở giữa mã chỉ đơn giản là sai (hoặc có thể đã lỗi thời). Việc kê khai của chú thích bản thân cho thấy rằng nó chỉ được phép cho 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

Cảm ơn - Tôi đang cố gắng sử dụng nó trên một phương pháp khi được đặt ở vị trí 2, nhưng tôi vẫn không thể làm cho nó hoạt động. Tôi đã đặt Min SDK phiên bản 11 trong tệp kê khai để lấy mã để biên dịch, nhưng tôi vẫn muốn tìm hiểu cách để TargetApi làm việc với phiên bản SDK tối thiểu 8. Mẫu mã của bạn cho biết @ Target, chứ không phải @ TargetApi - là có ý nghĩa? Tôi nhận được cùng một lỗi ("lỗi cú pháp" khi nó ở trong mã, "không thể được giải quyết" khi nó là trước khi phương pháp) cho dù tôi sử dụng @ Target (11) hoặc @ TargetApi (11). – Dave

+0

Đây là mã nguồn của chú thích TargetApi _itself_ trong Android, điều này không được sử dụng trong mã Java của bạn.Và nó chỉ cho thấy rằng bạn chỉ có thể sử dụng chú thích TargetApi ở loại _declarations_, phương thức _declarations_ hoặc constructor _declarations_. Chú thích TargetApi không được phép ở giữa một số khối mã, do đó, bạn thử. – Bananeweizen

Các vấn đề liên quan