android 常用注解,Android 開發小工具之:注解 Annotation

Android Support 包之一的 support-annotations是通過靜態編譯檢測來提高代碼質量的一個注解工具。里面包含了 Android 開發中常用的代碼檢測注解,幫助開發者提高代碼質量。通過 SDK Manager下載 Android Support Repository 后,在 Gradle 中通過如下聲明來使用該注解包:

dependencies {

compile ‘com.android.support:support-annotations:22.2.0’

}

該工具包含如下幾種類型的代碼檢測:

檢測參數或者返回值是否可以為 null

@Nullable 和 @NonNull 會分別檢測一個變量、參數或者函數返回值是否為 null。如果一個函數的參數用 @NonNull 注解,當調用該函數指定該參數為 null 的時候,代碼檢測工具(Lint)會告訴你一個警告,該參數不能為 null。而 @Nullable 則表示可以為 null。例如 如下的代碼表示 onCreateView 函數的返回值不為 null, 參數 context 和 attrs 也不能為 null:

import android.support.annotation.NonNull;

/** Add support for inflating the tag. */

@NonNull

@Override

public View onCreateView(String name, @NonNull Context context,

@NonNull AttributeSet attrs) {

}

資源類型注解

Android 開發中經常使用各種資源常量 R.XXX 來引用各種資源。例如 圖片資源和字符串資源。這些常量都是 int 類型的,在代碼檢測的時候沒法判斷引用的資源是否有錯誤,比如本來需要一個字符串資源,結果在代碼寫的時候用了一個顏色資源,這種情況只有通過測試才能發現,有些極端情況可能測試也不容易發現。資源類型注解就是為了解決該問題的,資源注解包含如下幾種:

@AnimatorRes 表明該參數、變量或者函數返回值應該是一個 Animator 類型的資源

@AnimRes 表明該參數、變量或者函數返回值應該是一個 Anim 類型的資源

@AnyRes 表明該參數、變量或者函數返回值應該是一個任意類型的資源

@ArrayRes 表明該參數、變量或者函數返回值應該是一個 Array 類型的資源

@AttrRes 表明該參數、變量或者函數返回值應該是一個 attribute 類型的資源

@BoolRes 表明該參數、變量或者函數返回值應該是一個布爾類型的資源

@ColorInt 表明該參數、變量或者函數返回值應該是一個顏色值而不是顏色資源引用,例如應該是一個 AARRGGBB 的整數值。

@ColorRes 表明該參數、變量或者函數返回值應該是一個 color 類型的資源,而不是顏色值。注意和 ColorInt 區別

@DimenRes 表明該參數、變量或者函數返回值應該是一個 dimension 類型的資源

@DrawableRes 表明該參數、變量或者函數返回值應該是一個 drawable 類型的資源

@FractionRes 表明該參數、變量或者函數返回值應該是一個 fraction 類型的資源

@IdRes 表明該參數、變量或者函數返回值應該是一個資源的 ID 類型

@IntegerRes 表明該參數、變量或者函數返回值應該是一個整數類型的資源

@InterpolatorRes 表明該參數、變量或者函數返回值應該是一個 interpolator 類型的資源

@LayoutRes 表明該參數、變量或者函數返回值應該是一個 layout 布局文件類型的資源

@MenuRes 表明該參數、變量或者函數返回值應該是一個 menu 類型的資源

@PluralsRes 表明該參數、變量或者函數返回值應該是一個 plurals 類型的資源

@RawRes 表明該參數、變量或者函數返回值應該是一個 raw 類型的資源

@StringRes 表明該參數、變量或者函數返回值應該是一個字符串類型的資源

@StyleableRes 表明該參數、變量或者函數返回值應該是一個 styleable 類型的資源

@StyleRes 表明該參數、變量或者函數返回值應該是一個 style 類型的資源

@TransitionRes 表明該參數、變量或者函數返回值應該是一個 transition 類型的資源

@XmlRes 表明該參數、變量或者函數返回值應該是一個 XML 類型的資源

例如下面的函數在調用的時候,如果用非字符串類型的 R 常量則會給出警告:

import android.support.annotation.StringRes;

public abstract void setTitle(@StringRes int resId);

線程注解類型

線程注解用來檢測一個函數是否在指定類型的線程中執行。 有四個:@UiThread @MainThread @WorkerThread @BinderThread

注意: 其中 @UiThread 和 @MainThread 是可替換用的, 大部分應用中,這兩個是一樣的。

如果一個類中的所有函數都在同一個線程內執行,可以在 類名稱上面用這個注解即可。

權限注解類型

@RequiresPermission 用來表明該函數執行需要一個或者多個權限,如果你沒有聲明這些權限,則會給出警告。例如:

@RequiresPermission(Manifest.permission.SET_WALLPAPER)

public abstract void setWallpaper(Bitmap bitmap) throws IOException;

@RequiresPermission(allOf = {

Manifest.permission.READ_HISTORY_BOOKMARKS,

Manifest.permission.WRITE_HISTORY_BOOKMARKS})

public static final void updateVisitedHistory(ContentResolver cr, String url, boolean real) {

}

@RequiresPermission(anyOf = {

Manifest.permission.READ_HISTORY_BOOKMARKS,

Manifest.permission.WRITE_HISTORY_BOOKMARKS})

public static final void updateHistory(ContentResolver cr, String url, boolean real) {

}

如果只要滿足多個權限中的一個,用 anyOf; 如果要滿足多個權限,用 allOf.

返回值是否使用檢測注解

@CheckResults 用來檢測函數的返回值是否被使用了,如果沒有使用則說明可能不應該調用這個函數,可以給出建議使用哪個函數。例如,新的 Android SDK 中就在 checkPermission 函數中使用如下注解:

@CheckResult(suggest=”#enforcePermission(String,int,int,String)”)

public abstract int checkPermission(@NonNull String permission, int pid, int uid);

如果你調用了 checkPermission 函數,但是并沒有使用其返回值,則很有可能你是想申請一個權限而不是檢查是否有這個權限,所以 suggest 參數建議你使用 enforcePermission 函數來申請權限。如果你確實想檢查是否有這個權限,則通常你會判斷 checkPermission 的返回值來確定是否有這個權限。

確保調用 super 函數的注解

@CallSuper 來表明重寫這個函數需要調用 super 父函數。如果你忘記了調用,則會提醒你。比如 Activity 的onCreate 函數需要代用 super.onCreate().

數值常量注解

@IntRange 是用來表明整數型參數的取值范圍的,比如 下面的 setAlpha 函數的參數 alpha 的取值范圍應該為 0 到 255,其他值都是非法的;

public void setAlpha(@IntRange(from=0,to=255) int alpha) { … }

@FloatRange 同樣是表明浮點數范圍的,例如:

public void setAlpha(@FloatRange(from=0.0, to=1.0) float alpha) {…}

而 @Size 是用來表明數組類型參數的長度的,可以用 @Size(min=1) 來指定數組的最小長度,@Size(2) 則表明該數組參數必須是2. 例如:、

int[] location = new int[3];

button.getLocationOnScreen(@Size(min=1) location);

創建枚舉類型注解

如果一個參數、變量的取值是幾個常量中的一個,則可以用 @IntDef 和 @StringDef 注解來自定義一個常量枚舉類型注解。使用方式如下所示:

import android.support.annotation.IntDef;

public abstract class ActionBar {

//定義所接受的常量值

@IntDef({NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS})

//告訴編譯器該注解不會在 .class 文件中存在

@Retention(RetentionPolicy.SOURCE)

//定義 NavigationMode 注解

public @interface NavigationMode {}

//Declare the constants

public static final int NAVIGATION_MODE_STANDARD = 0;

public static final int NAVIGATION_MODE_LIST = 1;

public static final int NAVIGATION_MODE_TABS = 2;

//Decorate the target methods with the annotation

@NavigationMode

public abstract int getNavigationMode();

//Attach the annotation

public abstract void setNavigationMode(@NavigationMode int mode);

上面的 @NavigationMode 注解使用了 @IntDef 來定義該注解所限定了一些常量值。 當你用 @NavigationMode 注解時,則說明這個參數或者函數返回值需要是 @IntDef 中定義的常量值其一 (NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, 或者 NAVIGATION_MODE_TABS).

除了定義具體的常量值以外,還可以通過 flag 參數來指定一個模式,例如下面的 DisplayOptions 注解定義該類型必須滿足依 DISPLAY_ 開頭的一個模式。

import android.support.annotation.IntDef;

@IntDef(flag=true, value={

DISPLAY_USE_LOGO,

DISPLAY_SHOW_HOME,

DISPLAY_HOME_AS_UP,

DISPLAY_SHOW_TITLE,

DISPLAY_SHOW_CUSTOM

})

@Retention(RetentionPolicy.SOURCE)

public @interface DisplayOptions {}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/531599.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/531599.shtml
英文地址,請注明出處:http://en.pswp.cn/news/531599.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

codeforces B. Friends and Presents(二分+容斥)

題意:從1....v這些數中找到c1個數不能被x整除,c2個數不能被y整除! 并且這c1個數和這c2個數沒有相同的!給定c1, c2, x, y, 求最小的v的值! 思路: 二分容斥,二分找到v的值,…

android音量鍵廣播,音量控制鍵控制的音頻流(setVolumeControlStream)描述

音量控制鍵控制的音頻流(setVolumeControlStream)描述2021-01-03 16:18Android教程網 Android當開發多媒體應用或者游戲應用的時候,需要使用音量控制鍵來設置程序的音量大小,在Android系統中有多種音頻流,感興趣的朋友可以了解下當開發多媒體應用或者游戲應用的時候…

eclipse的使用

eclipse如何打開一個已存在的工程!先給eclipse創建一個workspace,這個workspace就是一個文件夾用來管理eclipse項目的,或者修改eclipse的workspace,選擇菜單file->switch workspace->other,選擇一個已經存在的workspace。將已經存在的項目導入到wo…

Android延伸布局到狀態欄,Android 狀態欄透明

前言:最近項目大量用到狀態欄透明,網上也出現很多庫可以直接拿來用,個人認為沒有必要那么重引用到一個庫(有木有同學和我有一樣的想法),所以研究了一番,在此做個記錄加強記憶也便后期查閱,如果無意中有幸能…

glassfish服務器默認的網頁所在的位置

http://localhost:8080/ 默認打開的網頁所在的位置 E:/glassfish-4.1/glassfish/domains/domain1/docroot/index.html 轉載于:https://www.cnblogs.com/hujunzheng/p/4052920.html

華為HarmonyOS 鴻蒙,華為鴻蒙HarmonyOS2.0手機開發者Beta版正式發布

據悉,本次手機開發者Beta測試支持以下中國境內主制式手機及平板電腦。手機:全網通(5G雙卡)P40 、 全網通版P40 Pro、Mate30、Mate30(5G) 、Mate30 Pro、Mate30 Pro(5G),型號清單為ANA-AN00、ELS-AN00、TAS-AL00、TAS-AN00、LIO-AL00、LIO-AN0…

http協議客戶端向服務器端請求時一般需要發送的內容

out.println("GET /shopping/index.html HTTP/1.1");//請求行 包括請求方式,文件路徑, http協議版本(必寫)請求頭.... out.println("Aceept: */*");//客戶端能夠處理的文件類型(不是必須&#xff…

android oneshot自動播放bug,移動端常見bug匯總001

前言本文是摘錄整理了移動端常見的一些bug以及解決方案,第一篇,后面還會有持續的文章更新整理。點擊樣式閃動Q: 當你點擊一個鏈接或者通過Javascript定義的可點擊元素的時候,它就會出現一個半透明的灰色背景。A:根本原因是-webkit-tap-highli…

int.class 與 Integer.class

TYPE 表示的引用類型所對應的基本類型的Class對象! 轉載于:https://www.cnblogs.com/hujunzheng/p/4055471.html

android uber啟動動畫,模仿Uber的啟動畫面(上)

啟動畫面(Splash Screen)——不但給開發者們提供了一個盡情發揮、創建有趣動畫的機會,也填補了App啟動時從終端慢吞吞地下載數據的時間。啟動畫面(動態的)對于App至關重要:它可以讓用戶不失興趣地耐心等待應用完成加載。盡管現在的啟動畫面多種多樣&…

java中產生對象的兩種方式

/** 普通new對象的過程!*/Person pp new Person();System.out.println(pp);/** 利用代用參數的構造器產生對象實例!* 首先獲得相應帶參數的構造器,然后利用構造器產生對象實例!*/pclass Class.forName("get_class_method.P…

智慧屏用鴻蒙的生態,緊隨鴻蒙OS手機版 ,智慧屏為什么對鴻蒙生態這么重要?...

原標題:緊隨鴻蒙OS手機版 ,智慧屏為什么對鴻蒙生態這么重要?12 月 21 日,華為正式發布了兩款智慧屏新品,智慧屏 S 系列和車載智慧屏,前者是智慧屏的新系列,后者則是新開辟的車機產品線。沒有意外…

java中反射機制通過字節碼文件對象獲取字段和函數的方法

pclass Class.forName("get_class_method.Person");//Field ageField pclass.getField("age");//因為age成員變量是私有的,所以會產生NoSuchFieldException異常Field ageField pclass.getDeclaredField("age");//獲得該對象反映此…

MySQL不能插入中文字符及中文字符亂碼問題

MySQL的默認編碼是Latin1,不支持中文,要支持中午需要把數據庫的默認編碼修改為gbk或者utf8。在安裝后MySQL之后,它的配置文件不是很給力,不知道你們的是不是,反正我的是! 開始插入中文字符的時候出現如下錯…

android計算距離頂部的距離,(lua版)計算距離的邏輯是從Android的提供的接口(Location.distanceBetween)中拔來的,應該是最精確的方法了...

---coding by yuangu(lifulinghanaol.com)--用于計算2個pgs之間的距離function computeDistance(lat1, lon1,lat2, lon2)-- Based on http://www.ngs.noaa.gov/PUBS_LIB/inverse.pdf-- using the "Inverse Formula" (section 4)local MAXITERS 20;-- Convert lat/lo…

codeforces C. Bits(數學題+或運算)

題意:給定一個區間,求區間中的一個數,這個數表示成二進制的時候,數字1的個數最多! 如果有多個這樣的數字,輸出最小的那個! 思路:對左區間的這個數lx的二進制 從右往左將0變成1&#…

密碼與確認密碼自動驗證html,HTML確認密碼

今天準備分享一個小知識點,就是確認登錄界面輸入戶名: 輸入密碼: 確認密碼: function validate() {var pw1 document.getElementById("pw1").value;var pw2 document.getElementById("pw2").value;if(pw1 …

實現單詞大小寫不敏感的正則表達式的匹配!

//實現單詞大小寫不敏感的正則表達式的匹配! //方法1: tmp "java java JavaJAVA"; px Pattern.compile("java", Pattern.CASE_INSENSITIVE); mx px.matcher(tmp); System.out.println(mx.replaceAll("JAVA")); //方法二…

r語言 發送郵件html,r語言讀取數據的方法

R 對于基于 SQL 語言的關系型數據庫有良好的支持,這些數據庫既有商業數據庫 Oracle、Microsoft SQL Server、IBM DB2 等,也包含在 GNUGeneral Public License (GPL) 下發布的 MySQL 等開源數據庫。RMySQL 包中提供了到 MySQL 數據庫的接口;RO…

正則表達式之IP地址檢驗

String ipRegex "^(\\d|[1-9]\\d|1\\d*|2[0-4]\\d|25[0-5])(\\.\\1){3}$"; /* * \\d|[1-9]\\d|1\\d*|2[0-4]\\d|25[0-5] * 該段的數字只有一位的時候,兩位數字的時候,三位數字的時候(1開頭的和2開頭的) * \\1 表示向前…