Android Lint掃描規則說明(一)

主要內容

對Android Studio支持的六類Android Lint規則, 本文主要對AccessibilityInternationalization 兩中類型所包含的14個項的說明,主要內容都是文檔翻譯,適當加一些本身的感想。html

圖一 總覽

Accessibility

可訪問性的檢查,除了第一項以外,其餘項更像是爲某些自動化的工具作的準備工做,不影響APP的運行。android

ClickableViewAccessibility

ClickableViewAccessibility

可點擊View的可訪問性:若是重寫onTouchEvent或使用OnTouchListener的View在檢測到單擊時沒有實現performClick並調用它,則視圖可能沒法正確處理可訪問性操做。理想狀況下,處理單擊操做的邏輯應該放在View#performClick中,由於當單擊操做發生時,一些可訪問性服務會調用performClick。app

ContentDescription

ContentDescription - 1

非文本Widget描述:ide

  • 首先,像ImageViews和ImageButtons這樣的非文本Widget應該使用contentDescription屬性指定文本對Widget進行說明,以便屏幕閱讀器和其餘可訪問性工具可以充分描述和理解用戶界面。
  • 其次,若是一個非文本Widget在用戶界面上只是一個裝飾,不展現任何內容也不接受任何用戶操做,就不須要給它提供描述性的contentDescription屬性文本,而是使用tool屬性tools:ignore="ContentDescription"抑制lint提醒。
  • 第三,對於文本型Widget不能同時設置hintcontentDescription,不然hint將不會展現在界面上,只設置hint就能夠。

參考:Make apps more accessible工具

ContentDescription - 2

GetContentDescriptionOverride

重寫非文本Widget描述方法getContentDescription:重寫View的getContentDescription方法,可能會阻止某些可訪問性服務正確導航視圖公開的內容。相反,當內容描述須要更改時,調用setContentDescription。ui

KeyboardInaccessibleWidget

KeyboardInaccessibleWidget - 1

鍵盤沒法訪問Widget:若是一個Widget聲明瞭能夠點擊,可是沒有聲明能夠得到焦點,這個Widget是沒法經過鍵盤訪問的,須要設置focusable=true。google

KeyboardInaccessibleWidget - 2

LabelFor

LabelFor - 1

缺乏可訪問標籤:可編輯的控件例如EditText應該爲hint屬性賦值,或者在minSDKVersion大於等於17時,使用labelFor屬性爲EditText指定一個標籤控件。標籤控件能夠是指定了text屬性的文字控件如TextView,也能夠是指定了contentDescription的非文字控件如ImageView。編碼

LabelFor - 2

若是被指定的標籤控件如TextView在另一個layout文件中,且使用layout屬性引用了EditText所在的layout文件,能夠ignore這個lint檢查。.net

LabelFor - 3

Internationalization

ByteOrderMark

查了一下這個ByteOrderMark,簡稱BOM,指的是一些標記字符。這種問題通常是「在不一樣編碼格式的文件之間拷貝字符或者在某些文件系統上編輯了文件」致使的。翻譯

文件內BOM提醒:Lint會把文件中包含的BOM字符標記出來。由於Android工程中咱們指望使用utf-8對文件和字符進行編碼。BOM字符對utf-8來講不是必需的,並且有一些工具是不能正確處理帶BOM字符的文本的。

參考:Android提示BOM錯誤排查UTF8最好不要帶BOM

EnforceUTF8

EnforceUTF8

資源文件編碼格式非utf-8:XML文件對編碼類型的支持比較普遍。然而有些工具不能正確某些類型編碼的文件,而utf-8在Android應用中是一種被普遍支持的編碼類型。使用utf-8對文件進行編碼,能夠防止在處理non-ASCII類型的字符時出現奇怪的問題。尤爲是Gradle在合併XML類型的資源文件時,預先假定文件是使用utf-8進行編碼的。

HardcodedText

HardcodedText

硬編碼文本屬性:不要在layout文件或者代碼中直接爲文本控件設置text屬性值。

  • 在不一樣的位置屢次使用相同的文本,若是須要修改文本則會引發多處修改。
  • APP不能經過爲文本提供一份翻譯列表就能夠適用新的語言的用戶,而有不少工具能夠快速的完成提供翻譯列表的操做。
  • 好的作法是,把text屬性的文本值定義在string.xml文件中,方便國際化拓展。

SetTextI18n

SetTextI18n

TextView國際化:在調用TextView.setText()給TextView賦值時,不能使用Number.toString()例如圖中的Integer.toString(mProfile.getLeftStarCount())把數字轉爲字符串賦值,由於Number.toString()不能正確處理分隔符和特定語言環境中的數字。

建議使用 String.format() 指定合適的佔位符進行賦值。

不能直接使用文本給TextView.setText(),具體參照HardcodedText的說明。代碼中可使用@SuppressLint("SetTextI18n") 禁用lint的這項檢查。

RelativeOverlap

RelativeOverlap

RelativeOverlap是指RelativeLayout位於同一水平方向的兩個Widget分別位於layout的左右兩邊,又都沒有限制控件的長度,隨着內容的增加,兩個控件中間的距離不斷縮小,最後會有部分重疊。因此,要控制一下邊界。

Bidrrectional Text 雙向文本

RtlEnabled

在API 17或更高版本上使用RTL屬性須要在manifest文件的application標籤中設置android:supportsRtl="true"。若是已經開始在layout文件中加入RTL屬性,可是沒有徹底使用RTL替代舊版的屬性設置,能夠設置android:supportsRtl="false"規避lint的檢查。

RtlCompat

RtlCompat

API 17之後給文本控件提供了一個textAlignment屬性來控制水平方向文字的對齊方式。可是,若是APP支持的版本包含小於 API 17 的版本,那麼必需要設置gravity或者layout_gravity屬性,由於老版本的系統會忽略textAlignment屬性值。

RtlHardcoded

強制方向設置:在文本對齊和控件對齊中使用Gravity.LEFT/Gravity.RIGHT的方式指定在左側或者右側對齊的情形,或在文字從右往左書寫的國家或者地區形成困擾。使用Gravity.START/Gravity.END就能夠解決這個問題。同理,在layout文件中設置gravity/layout_gravity屬性時使用start/end替代left/right

屬性paddingLeft/paddingRight和屬性layout_marginLeft/layout_marginRight也須要替換爲paddingStart/paddingEndlayout_marginStart/layout_marginEnd

若是APP支持的最小API版本小於 API 17,那麼須要同時提供left/right屬性和start/end屬性,由於低版本的系統會忽略start/end屬性。

RtlSymmetry

margin|padding左右對稱:若是對一個layout對象指定一邊的內邊距或外邊距,那麼應該對另外一邊指定一樣大小的內邊距或外邊距。

參考文獻

相關文章
相關標籤/搜索