2017-08-20 28 views
11

Tôi đã sử dụng phương thức setId của lớp View. Theo phương pháp nàyChú thích Android Hoạt động của @IdRes

public void setId(@IdRes int id) // This will accept resource id 

Khi tôi cố gắng sử dụng phương pháp này với một số giá trị hardcoded int (hãy nói 100), sau đó phương pháp này bắt đầu ném cảnh báo đúng được expected-

actionButton.setId(100); 

dự kiến tài nguyên của id loại.

Nhưng khi tôi chuyển đổi giá trị hardcoded này thành một phương pháp và không bao giờ được xác định rằng phương thức này sẽ trả về @IdRes, Cảnh báo sẽ im lặng.

private int getViewId() { 
     return 100; 
    } 

Gọi để đặt Id.

actionButton.setId(getViewId()); 

Cả hai đều không giống nhau. Đã mã hóa intint trả về từ phương pháp này. Vì vậy, tại sao trong một trường hợp phương pháp ném cảnh báo và trong một khác nó được im lặng.

Vì lợi ích tôi đã thử với StringRes nhưng tôi nhận được cảnh báo trong cả hai trường hợp.

private void setMyString(@StringRes int resourceString) {} 

Cảnh báo ở cả hai bên dưới cases-

setMyString(1); 
    setMyString(getStringId()); getStringId returns int value 
+0

Tôi nghĩ chú thích @IdRes buộc bạn sử dụng id tài nguyên thay vì int. Có thể gán id tài nguyên cho biến số – Inducesmile

+0

Có Tôi đồng ý @Inducesmile nhưng trong trường hợp StringRes, nó không bao giờ ném cảnh báo trong cả hai trường hợp – Rahul

+0

Bạn có chạy lint hoặc sử dụng trình phân tích luồng dữ liệu tích hợp của Android Studio (IntelliJ IDEA) không? – laalto

Trả lời

2

Nó chỉ là một Lint cảnh báo kể từ khi phương pháp này hy vọng một biến là từ lớp R.id.

Về trường hợp giá trị được trả về từ một phương thức, Lint không bận tâm kiểm tra toàn bộ hàm cho dù nó trả về một số nguyên được mã cứng hay một id thực.

Từ các tài liệu của @IdRes nó khẳng định:

Biểu thị rằng một số nguyên, lĩnh vực hoặc phương pháp giá trị trả về là dự kiến ​​sẽ là một tài liệu tham khảo tài nguyên id (ví dụ android.R.id.copy).

Ngoài ra chú thích chỉ tồn tại trong mã nguồn cho tài liệu. Sau khi mã được biên dịch, chú thích sẽ bị xóa.

+1

Đây không phải là một trường hợp, tôi đã thử với StringRes và phương thức nào trả về chắc chắn là vấn đề. Vui lòng kiểm tra câu hỏi đã cập nhật của tôi. – Rahul

+0

Vâng, có vẻ như @StringRes cũng hy vọng câu lệnh trả về của mehtod là từ lớp 'R.string'. Nhưng một lần nữa, chỉ là một cảnh báo! –

+0

Có Tôi đồng ý với bạn Nabin cảnh báo lint của nó, nhưng hiện tại tôi đang cố gắng tìm ra logic đằng sau điều đó. Tại sao StringRes ném lỗi và IdRes thì không. Tôi đánh giá cao sự giúp đỡ của bạn. – Rahul

0

Trong một trường hợp (@IdRes), bạn đang gọi phương thức từ API (View.setId()), trong khi khác, bạn đang gọi một phương thức trong mã của riêng bạn. Ngoài ra getViewId() không được chú thích, do đó, nó không phải là hiển nhiên từ chữ ký loại int nó trả về.

Với các phương pháp sau:

private int getUndefinedRes() { 
    ... 
} 

private @IdRes int getIdRes() { 
    ... 
} 

private @StringRes int getStringRes() { 
    ... 
} 

private void setMyString(@StringRes int resourceString) { 
} 

private void setMyId(@IdRes int resourceId) { 
} 

Các lint và kiểm tra kết quả (như của Android Studio 2.3.3):

// API method with definitely wrong value (constant) 
    // --> ERROR 
    new View(context).setId(100); 
    new TextView(context).setText(100); 

    // API method with definitely wrong value (from method declaration) 
    // --> ERROR 
    new View(context).setId(getStringRes()); 
    new TextView(context).setText(getIdRes()); 

    // API method with potentially wrong value 
    // --> ok 
    new View(context).setId(getUndefinedRes()); 
    new TextView(context).setText(getUndefinedRes()); 

    // own method with potentially wrong value 
    // --> ERROR 
    setMyString(getUndefinedRes()); 
    setMyId(getUndefinedRes()); 

Dường như lint chỉ nhìn vào chữ ký phương thức.

Nó cũng là khoan dung hơn khi bạn gọi một phương pháp API: nó cho thấy một lỗi chỉ khi nó là rõ ràng rằng bạn đang làm điều gì đó sai trái. Tôi nghĩ rằng đó là vì làm theo cách khác sẽ buộc tất cả mọi người phải thêm nhiều chú thích.

Mặt khác, khi bạn thêm chú thích trong mã của mình, bạn đang chọn tham gia cho mức độ nghiêm trọng bổ sung.

+0

Không, tôi không ghi đè lên bất kỳ phương thức setId() nào, tôi chỉ sử dụng phương thức setId của Chế độ xem. Trường hợp mà bạn đã đề cập cuối cùng -> setMyId (getUndefinedRes());// phương pháp này không phải là ném bất kỳ lỗi nào là mối quan tâm của tôi. – Rahul

+0

Tôi nghĩ rằng trong cả hai trường hợp (int hoặc chuỗi) nó không có gì để làm với trọng, nhưng cho dù bạn đang gọi một phương thức từ API Android hoặc từ mã của riêng bạn. – bwt

+0

bwt, cảm ơn bạn đã xem xét điều này, Nhưng tôi không gọi bất kỳ phương pháp nào từ Api. Cả hai phương thức được viết trong tệp java của tôi – Rahul

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