对Android Studio支持的六类Android Lint规则, 本文主要对Accessibility 和 Internationalization 两中类型所包含的14个项的说明,主要内容都是文档翻译,适当加一些本身的感想。html
可访问性的检查,除了第一项以外,其余项更像是为某些自动化的工具作的准备工做,不影响APP的运行。android
可点击View的可访问性:若是重写onTouchEvent或使用OnTouchListener的View在检测到单击时没有实现performClick并调用它,则视图可能没法正确处理可访问性操做。理想状况下,处理单击操做的逻辑应该放在View#performClick中,由于当单击操做发生时,一些可访问性服务会调用performClick。app
非文本Widget描述:ide
- 首先,像ImageViews和ImageButtons这样的非文本Widget应该使用contentDescription属性指定文本对Widget进行说明,以便屏幕阅读器和其余可访问性工具可以充分描述和理解用户界面。
- 其次,若是一个非文本Widget在用户界面上只是一个装饰,不展现任何内容也不接受任何用户操做,就不须要给它提供描述性的contentDescription属性文本,而是使用tool属性tools:ignore="ContentDescription"抑制lint提醒。
- 第三,对于文本型Widget不能同时设置hint和contentDescription,不然hint将不会展现在界面上,只设置hint就能够。
参考:Make apps more accessible工具
重写非文本Widget描述方法getContentDescription:重写View的getContentDescription方法,可能会阻止某些可访问性服务正确导航视图公开的内容。相反,当内容描述须要更改时,调用setContentDescription。ui
键盘没法访问Widget:若是一个Widget声明了能够点击,可是没有声明能够得到焦点,这个Widget是没法经过键盘访问的,须要设置focusable=true。google
缺乏可访问标签:可编辑的控件例如EditText应该为hint属性赋值,或者在minSDKVersion大于等于17时,使用labelFor属性为EditText指定一个标签控件。标签控件能够是指定了text属性的文字控件如TextView,也能够是指定了contentDescription的非文字控件如ImageView。编码
若是被指定的标签控件如TextView在另一个layout文件中,且使用layout属性引用了EditText所在的layout文件,能够ignore这个lint检查。.net
查了一下这个ByteOrderMark,简称BOM,指的是一些标记字符。这种问题通常是“在不一样编码格式的文件之间拷贝字符或者在某些文件系统上编辑了文件”致使的。翻译
文件内BOM提醒:Lint会把文件中包含的BOM字符标记出来。由于Android工程中咱们指望使用utf-8对文件和字符进行编码。BOM字符对utf-8来讲不是必需的,并且有一些工具是不能正确处理带BOM字符的文本的。
参考:Android提示BOM错误排查、UTF8最好不要带BOM
资源文件编码格式非utf-8:XML文件对编码类型的支持比较普遍。然而有些工具不能正确某些类型编码的文件,而utf-8在Android应用中是一种被普遍支持的编码类型。使用utf-8对文件进行编码,能够防止在处理non-ASCII类型的字符时出现奇怪的问题。尤为是Gradle在合并XML类型的资源文件时,预先假定文件是使用utf-8进行编码的。
硬编码文本属性:不要在layout文件或者代码中直接为文本控件设置text属性值。
- 在不一样的位置屡次使用相同的文本,若是须要修改文本则会引发多处修改。
- APP不能经过为文本提供一份翻译列表就能够适用新的语言的用户,而有不少工具能够快速的完成提供翻译列表的操做。
- 好的作法是,把text属性的文本值定义在string.xml文件中,方便国际化拓展。
TextView国际化:在调用TextView.setText()给TextView赋值时,不能使用Number.toString()例如图中的Integer.toString(mProfile.getLeftStarCount())把数字转为字符串赋值,由于Number.toString()不能正确处理分隔符和特定语言环境中的数字。
建议使用 String.format() 指定合适的占位符进行赋值。
不能直接使用文本给TextView.setText(),具体参照HardcodedText的说明。代码中可使用@SuppressLint("SetTextI18n") 禁用lint的这项检查。
RelativeOverlap是指RelativeLayout位于同一水平方向的两个Widget分别位于layout的左右两边,又都没有限制控件的长度,随着内容的增加,两个控件中间的距离不断缩小,最后会有部分重叠。因此,要控制一下边界。
在API 17或更高版本上使用RTL属性须要在manifest文件的application标签中设置android:supportsRtl="true"。若是已经开始在layout文件中加入RTL属性,可是没有彻底使用RTL替代旧版的属性设置,能够设置android:supportsRtl="false"规避lint的检查。
API 17之后给文本控件提供了一个textAlignment属性来控制水平方向文字的对齐方式。可是,若是APP支持的版本包含小于 API 17 的版本,那么必需要设置gravity或者layout_gravity属性,由于老版本的系统会忽略textAlignment属性值。
强制方向设置:在文本对齐和控件对齐中使用Gravity.LEFT/Gravity.RIGHT的方式指定在左侧或者右侧对齐的情形,或在文字从右往左书写的国家或者地区形成困扰。使用Gravity.START/Gravity.END就能够解决这个问题。同理,在layout文件中设置gravity/layout_gravity属性时使用start/end替代left/right。
属性paddingLeft/paddingRight和属性layout_marginLeft/layout_marginRight也须要替换为paddingStart/paddingEnd和layout_marginStart/layout_marginEnd。
若是APP支持的最小API版本小于 API 17,那么须要同时提供left/right属性和start/end属性,由于低版本的系统会忽略start/end属性。
margin|padding左右对称:若是对一个layout对象指定一边的内边距或外边距,那么应该对另外一边指定一样大小的内边距或外边距。