Android 規範

weixin_34402408發表於2017-06-12

1、AS規範

  • 儘量使用統一的IDE進行開發;
  • 編碼格式統一為UTF-8;
  • 編輯完.java、 .xml等檔案後一定要格式化(基本格式方面使用 AS 預設模板即可);
  • 刪除多餘的import,減少警告出現,可利用AS的Optimize Imports(Settings → Keymap → Optimize Imports)快捷鍵;

2、命名規範

程式碼中的命名嚴禁使用拼音與英文混合的方式,更不允許直接使用中文的方式。即使純拼音命名方式也要避免採用。但alibaba、taobao、youku、hangzhou等國際通用的名稱,可視同英文。

2.1包名

包名全部小寫,連續的單詞只是簡單地連線起來,不使用下劃線,採用反域名命名規則,全部使用小寫字母。
一級包名是頂級域名,通常為com,edu,gov,net,org等,二級包名為公司名,三級包名根據應用進行命名,後面就是對包名的劃分了,關於包名的劃分,使用按功能分。

目前進行統一
一級包名為com
二級包名為jeno
三級包名根據應用來進行命名 如智農聯-->com.jeno.bigfarmer

2.2類名
  • 類名都以UpperCamelCase風格編寫。
  • 類名通常是名詞或名詞短語,介面名稱有時可能是形容詞或形容詞短語。
  • 名詞,採用大駝峰命名法,儘量避免縮寫,除非該縮寫是眾所周知的, 比如HTML, URL,如果類名稱中包含單詞縮寫,則單詞縮寫的每個字母均應大寫。
  • 介面(interface)命名規則與類一樣採用大駝峰命名法,以able結尾
    interface Runnable

注意:如果專案採用MVP,所有Model、View、Presenter的介面都以I為字首,不加字尾,其他的介面採用上述命名規則。

介面類 描述 例如
ILoginView 登入的View層 登入View層一些介面的定義
ILoginPresent 登入的Present層 登入Present層一些介面的定義
ILoginPresent 登入的Present層 登入Present層一些介面的定義
... ... ...
描述 例如
Activity 類 Activity為字尾標識 歡迎頁面類WelcomeActivity
Adapter類 Adapter 為字尾標識 新聞詳情介面卡 NewDetailAdapter
解析類 Parser為字尾標識 首頁解析類HomePosterParser
工具方法類 Utils或Manager為字尾標識(與系統或第三方的Utils區分)或功能+Utils 執行緒池管理類:ThreadPoolManager日誌工具類:LogUtils(Logger也可)列印工具類:PrinterUtils
資料庫類 以DBHelper字尾標識 新聞資料庫:NewDBHelper
Service類 以Service為字尾標識 時間服務TimeService
BroadcastReceiver類 以Receiver為字尾標識 推送接收JPushReceiver
ContentProvider類 以Provider為字尾標識 ShareProvider
自定義的共享基礎類 以Base開頭 BaseActivity,BaseFragment
... ... ...
2.3方法名

方法名都以lowerCamelCase風格編寫。
方法名通常是動詞或動詞短語。

方法 描述
initXX() 始化相關方法,使用init為字首標識,如初始化佈局initView()
isXX() checkXX() 方法返回值為boolean型的請使用is或check為字首標識
getXX() 返回某個值的方法,使用get為字首標識
setXX() 設定某個屬性值
handleXX()/processXX() 對資料進行處理的方法
displayXX()/showXX() 彈出提示框和提示資訊,使用display/show為字首標識
updateXX() 更新資料
saveXX() 儲存資料
resetXX() 重置資料
clearXX() 清除資料
removeXX() 移除資料或者檢視等,如removeView();
drawXX() 繪製資料或效果相關的,使用draw字首標識
2.4常量名

常量名命名模式為CONSTANT_CASE,全部字母大寫,用下劃線分隔單詞。

2.5非常量欄位名

非常量欄位名以lowerCamelCase風格的基礎上改造為如下風格:

基本結構為scopeVariableNameType。

scope:範圍

非公有,非靜態欄位命名以m開頭。
靜態欄位命名以s開頭。
公有非靜態欄位命名以p開頭。
公有靜態欄位(全域性變數)命名以g開頭。
例子:

非常量 描述
private int mPrivate 非公有,非靜態欄位命名以m開頭。
protected int mPrivate 非公有,非靜態欄位命名以m開頭。
private static MyClass sSingletion 靜態欄位命名以s開頭。
public int pField 公有非靜態欄位命名以p開頭。
public static int gField 公有靜態欄位(全域性變數)命名以g開頭。

考慮到Android中使用很多UI控制元件,為避免控制元件和普通成員變數混淆以及更好達意,所有用來表示控制元件的成員變數統一加上控制元件縮寫作為字首。(忽略上面的定義 不用加入 m s p g 等...) 建議使用 ButterKnife

名稱 縮寫 使用
TextView tv tvLogin
EditText et ...
ImageButton ib ...
Button btn ...
ImageView iv ...
ListView lv ...
GridView gv ...
ProgressBar pb ...
SeekBar sb ...
RadioButtion rb ...
CheckBox cb ...
ScrollView sv ...
LinearLayout ll ...
FrameLayout fl ...
RelativeLayout rl ...
RecyclerView rv ...
WebView wv ...
VideoView vv ...
Spinner spn ...
ToggleButton tb ...

對於普通變數一般不新增型別字尾,如果統一新增型別字尾

用統一的量詞通過在結尾處放置一個量詞,就可建立更加統一的變數,它們更容易理解,也更容易搜尋。
例如,請使用 mCustomerStrFirst 和 mCustomerStrLast ,而不要使用mFirstCustomerStr和mLastCustomerStr。

量詞列表 量詞字尾說明
First 一組變數中的第一個
Last 一組變數中的最後一個
Next 一組變數中的下一個變數
Prev 一組變數中的上一個
Cur 一組變數中的當前變數

另外注意 : 集合新增如下字尾:List、Map、Set
陣列新增如下字尾:Arr

注意:所有的VO(值物件)統一採用標準的lowerCamelCase風格編寫,所有的DTO(資料傳輸物件)就按照介面文件中定義的欄位名編寫。

2.6引數名

引數名以lowerCamelCase風格編寫。
引數應該避免用單個字元命名。

2.7引數名

引數名以lowerCamelCase風格編寫。

2.8 臨時變數

臨時變數通常被取名為i、j、k、m和n,它們一般用於整型;c、d、e,它們一般用於字元型。 如:for (int i = 0; i < len ; i++)。

2.9 型別變數名

型別變數可用以下兩種風格之一進行命名:

單個的大寫字母,後面可以跟一個數字(如:E, T, X, T2)。
具體的命名規範按照類的名字命名,不過後面加上一個大寫的 T (如:RequestT, FooBarT)

3、 資原始檔規範

3.1 資源佈局檔案(XML檔案(layout佈局檔案))

全部小寫,採用下劃線命名法

3.1.1 contentView命名

必須以全部單詞小寫,單詞間以下劃線分割,使用名詞或名詞片語。

所有Activity或Fragment的contentView必須與其類名對應,對應規則為:將所有字母都轉為小寫,將型別和功能調換(也就是字尾變字首)。

例如:activity_main.xml

3.1.2 Dialog命名

規則:dialog_描述.xml
例如:dialog_hint.xml

3.1.3 PopupWindow命名

規則:ppw_描述.xml
例如:ppw_info.xml

3.1.4 列表項命名

規則:item_描述.xml
例如:item_city.xml

3.1.5 包含項命名

規則:模組(位置)描述.xml
例如:activity_main_head.xmlactivity_main_bottom.xml
注意:通用的包含項命名採用:專案名稱縮寫_描述.xml
例如:xxxx_title.xml

3.1.6 資原始檔(圖片drawable資料夾下)

全部小寫,採用下劃線命名法,加字首區分

命名模式:可加字尾 _small 表示小圖, _big 表示大圖,邏輯名稱可由多個單詞加下劃線組成,採用以下規則:

  • 用途_模組名_邏輯名稱
  • 用途_模組名_顏色
  • 用途_邏輯名稱
  • 用途_顏色

說明:用途也指控制元件型別 (上面附有UI的定義表)

例如:

名稱 說明
btn_main_home.png 按鍵 用途_模組名_邏輯名稱
divider_maket_white.png 分割線 用途_模組名_顏色
ic_edit.png 圖示 用途_邏輯名稱
bg_main.png 背景 用途_邏輯名稱
btn_red.png 紅色按鍵 用途_顏色
btn_red_big.png 紅色大按鍵 用途_顏色
ic_head_small.png 小頭像 用途_邏輯名稱
bg_input.png 輸入框背景 用途_邏輯名稱
divider_white.png 白色分割線 用途_顏色
bg_main_head 主模組頭部背景圖片 用途_模組名_邏輯名稱
def_search_cell 預設搜尋介面單元圖片 用途_模組名_邏輯名稱
ic_more_help 更多幫助圖示 用途_邏輯名稱
divider_list_line 列表分割線 用途_邏輯名稱
selector_search_ok 搜尋介面確認選擇器 用途_模組名_邏輯名稱
shape_music_ring 音樂介面環形形狀 用途_模組名_邏輯名稱

如果有多種形態,如按鈕選擇器: btn_xx.xml(selector)

名稱 說明
btn_xx 按鈕圖片使用 btn_整體效果(selector)
btn_xx_normal 按鈕圖片使用btn_正常情況效果
btn_xx_pressed 按鈕圖片使用btn_點選時候效果
btn_xx_focused state_focused聚焦效果
btn_xx_disabled state_enabled (false)不可用效果
btn_xx_checked state_checked選中點選效果
btn_xx_selected state_selected選中效果
btn_xx_hovered state_hovered懸停效果
btn_xx_checkable state_checkable可選效果
btn_xx_activated state_activated啟用的
btn_xx_windowfocused state_window_focused

注意:使用AndroidStudio的外掛SelectorChapek可以快速生成selector,前提是命名要規範。

3.2 動畫檔案(anim資料夾下)

全部小寫,採用下劃線命名法,加字首區分。
具體動畫採用以下規則:模組名_邏輯名稱
例如:refresh_progress.xml、market_cart_add.xml、market_cart_remove.xml。

普通的tween動畫採用如下表格中的命名方式:動畫型別_方向

名稱 說明
fade_in 淡入
fade_out 淡出
push_down_in 從下方推入
push_down_out 從下方推出
push_left 推向左方
slide_in_from_top 從頭部滑動進入
zoom_enter 變形進入
slide_in 滑動進入
shrink_to_middle 中間縮小
3.3 values中name命名
3.3.1 colors.xml

colors的name命名使用下劃線命名法,在你的colors.xml檔案中應該只是對映顏色的名稱一個ARGB值,而沒有其它的。不要使用它為不同的按鈕來定義ARGB值。

進行這樣定義 講一個風格的顏色放到一起

<resources>

      <!-- grayscale -->
      <color name="white"     >#FFFFFF</color>
      <color name="gray_light">#DBDBDB</color>
      <color name="gray"      >#939393</color>
      <color name="gray_dark" >#5F5F5F</color>
      <color name="black"     >#323232</color>

      <!-- basic colors -->
      <color name="green">#27D34D</color>
      <color name="blue">#2A91BD</color>
      <color name="orange">#FF9D2F</color>
      <color name="red">#FF432F</color>

  </resources>
3.3.2 dimens.xml

像對待colors.xml一樣對待dimens.xml檔案 與定義顏色調色盤一樣,你同時也應該定義一個空隙間隔和字型大小的“調色盤”。 如下所示:

<resources>

    <!-- font sizes -->
    <dimen name="font_larger">22sp</dimen>
    <dimen name="font_large">18sp</dimen>
    <dimen name="font_normal">15sp</dimen>
    <dimen name="font_small">12sp</dimen>

    <!-- typical spacing between two views -->
    <dimen name="spacing_huge">40dp</dimen>
    <dimen name="spacing_large">24dp</dimen>
    <dimen name="spacing_normal">14dp</dimen>
    <dimen name="spacing_small">10dp</dimen>
    <dimen name="spacing_tiny">4dp</dimen>

    <!-- typical sizes of views -->
    <dimen name="button_height_tall">60dp</dimen>
    <dimen name="button_height_normal">40dp</dimen>
    <dimen name="button_height_short">32dp</dimen>

</resources>
3.3.3 strings.xml

strings的name命名使用下劃線命名法,採用以下規則:模組名+邏輯名稱,這樣方便同一個介面的所有string都放到一起,方便查詢。

名稱 說明
main_menu_about 主選單按鍵文字
friend_title 好友模組標題欄
friend_dialog_del 好友刪除提示
login_check_email 登入驗證
dialog_title 彈出框標題
button_ok 確認鍵
loading 載入文字
3.3.3 styles.xml

stylename命名使用大駝峰命名法,幾乎每個專案都需要適當的使用style檔案,因為對於一個檢視來說有一個重複的外觀是很常見的,將所有的外觀細節屬性(colors、padding、font)放在style檔案中。例如:

<style name="ContentText">
<item name="android:textSize">@dimen/font_normal</item>
<item name="android:textColor">@color/basic_black</item>
</style>


應用到```TextView```中:

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/price"
style="@style/ContentText"
/>

#####3.4 strings.xml
 layout中的id命名
命名模式為:```view縮寫_模組名_邏輯名```,比如```btn_main_search```
####4 註釋規範
#####4.1類註解
每個類完成後應該有作者姓名,該類的作用等資訊

/**

  • author : Blankj
    
  • e-mail : xxx@xx
    
  • time   : 2017/03/07
    
  • desc   : xxxx描述
    
  • version: 1.0
    

*/
public class WelcomeActivity {
...
}

上面的配置 在as中 Settings → Editor → File and Code Templates → Includes → File Header,輸入

/**

  • author : ${USER}
    
  • e-mail : xxx@xx
    
  • time   : ${YEAR}/${MONTH}/${DAY}
    
  • desc   : 
    
  • version: 1.0
    

*/


#####4.2方法註釋
每一個成員方法(包括自定義成員方法、覆蓋方法、屬性方法)的方法頭都必須做方法頭註釋。

/**

  • bitmap轉byteArr
  • @param bitmap bitmap物件
  • @param format 格式
  • @return 位元組陣列
    */
    public static byte[] bitmap2Bytes(Bitmap bitmap, CompressFormat format) {
    if (bitmap == null) return null;
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    bitmap.compress(format, 100, baos);
    return baos.toByteArray();
    }
#####4.3其他一些註釋
AS已幫你整合了一些註釋模板,我們只需要直接使用即可

// TODO: 17/3/14 需要實現,但目前還未實現的功能的說明
// FIXME: 17/3/14 需要修正,甚至程式碼是錯誤的,不能工作,需要修復的說明

###5其他一些規範
- 1、合理佈局,有效運用```<merge>```、```<ViewStub>```、```<include>```標籤;
- 2、```Activity```和```Fragment```裡面有許多重複的操作以及操作步驟,所以我們都需要提供一個```BaseActivity```和```BaseFragment```,讓所有的Activity和Fragment都繼承這個基類。
- 3、方法基本上都按照呼叫的先後順序在各自區塊中排列;
- 4、相關功能作為小區塊放在一起(或者封裝掉);
- 5、當一個類有多個建構函式,或是多個同名方法,這些函式/方法應該按順序出現在一起,中間不要放進其它函式/方法;
- 6、資料提供統一的入口。無論是在 MVP、MVC 還是 MVVM 中,提供一個統一的資料入口,都可以讓程式碼變得更加易於維護。比如可使用一個```DataManager```,把 ```http、preference```、```eventpost```、```database``` 都放在```DataManger```裡面進行操作,我們只需要與DataManger打交道;
- 7、多用組合, 少用繼承;
- 8、提取方法, 去除重複程式碼。對於必要的工具類抽取也很重要,這在以後的專案中是可以重用的。
- 9、儘可能使用區域性變數;
- 10、及時關閉流;
- 11、儘量減少對變數的重複計算;

for (int i = 0; i < list.size(); i++) {
...
}

改為

for (int i = 0, int length = list.size(); i < length; i++) {
...
}

- 12、採用懶載入的策略,即在需要的時候才建立;

String str = "aaa";
if (i == 1) {
list.add(str);
}

建議替換為:

if (i == 1) {
String str = "aaa";
list.add(str);
}

- 13、不要在迴圈中使用try…catch…,應該把其放在最外層;


目前就是這些  希望在用的時候有什麼問題的進行補充或者修改。

相關文章