Android 項目規範

一般咱們爲了項目的維護會定下一系列的規範開發來提升本身或者團隊之間的寫代碼的效率,正所謂無規矩不成方圓。java

Hello Android.jpg
Android Studio的使用android

Android 開發首選 Android Studio,一個好的IDE能讓你事半功倍。編碼規範使用 Android Studio 默認的模板規範便可,這也是比較方便的方法。同時也要注意如下幾點,可讓你的團隊協做更加協調:ios

1.統一調整 IDE 的編碼方式爲 UTF-8
2.編輯完代碼後不要忘記格式化(即 Ctrl+Alt+L 快捷鍵)
3.儘可能保證團隊之間的 IDE 版本與 Gradle 版本一致,最好的作法是及時更新保證與官方最新版一致。
4.代碼提交前進行代碼檢查(Analyze->Inspect Code),能夠消除代碼中的警告,減小沒必要要的錯誤。
5.擅用 //TODO 註釋來標記未作完或須要其餘人接手的工做
6.善用AS插件來提升開發效率,像 GsonFormat——將json字符串轉換成一個Java實體類的工具,CodeGlance——在右邊能夠預覽代碼,實現快速定位等工具都是很是棒的。
命名規範數據庫

最有效的命名方式是使用英文拼寫和語法,可讓閱讀者易於理解,儘可能避免使用中文拼音的狀況(常見地名和通用名稱例外,好比HangZhou,alibaba等)。禁止使用中英文混合或者徹底中文的方式。編程

包名json

一般一個app須要一個頂級包名,而這個包名一般跟公司的域名相關。一級包名是頂級域名,一般爲com,edu,gov,net,org等,二級包名爲公司名,三級包名根據應用進行命名。架構

好比個人我的域名爲 cpacm.net,那麼我我的所作的app包名通常爲net.cpacm.yourappname。app

再來講如何分包?
分包的方式說法不一,有的人喜歡按照層次來分,好比說將全部 Activity 放在同一個包下。有的人喜歡按照功能來分,將一個功能的 Activity、Model和Adapter等一些文件放入同一個包內。具體的例子能夠參考谷歌的 iosched 樣例。less

我我的比較推薦的方式是按照功能進行分包,但同時會將數據層再單獨分離出來,詳細的例子能夠看看我以前寫的文章——說說我本身經常使用的 Android 架構。不過每一個人的習慣並不一致,因此在這點上能夠隨意發揮,只要不致使整個項目結構混亂就成。編程語言

類名

一個類會包含(按順序地):

許可證或版權信息(若有須要)
package語句
import語句
一個頂級類
四個部分用一個空行隔開。
類名都以 UpperCamelCase 風格編寫。

在 Android 中與系統相關的類一般以組件名爲後綴標識。

Activity 類,命名爲 Activity 爲後綴,如 LoginActivity
Fragment 類,命名以 Fragment 爲後綴,如 LoginFragment
Service 類,命名以 Service 爲後綴,如 DownloadService
BroadcastReceiver類,命名以Receiver爲後綴,如 JPushReceiver
ContentProvider類, 命名以Provider爲後綴,如ShareProvider
Adapter 類,命名以 Adapter 爲後綴,如 ListAdapter
其餘一些常見的命名:

工具管理類,命名以 Utils 或者 Manager 爲後綴,如 EncryptUtils,UserManager
實體類,命名以 Bean 或者 Info 爲後綴,如 UserBean
接口實現類,命名以 Impl 或者 Listener 爲後綴,如 ApiImpl
數據庫類,命名以 Dao 或者 DbHelper 爲後綴,如 UserDao
自定義控件類,命名以 View 或者 Layout 爲後綴,如 SimpleSliderLayout
方法名

方法名都以 lowerCamelCase 風格編寫。

方法名一般是動詞或動詞短語。下劃線可能出如今JUnit測試方法名稱中用以分隔名稱的邏輯組件。並不存在惟一正確的方式來命名測試方法。

常見的方法名稱:

方法 說明
getXX()/setXX() 獲取/設置屬性值,如 getUserName()
isXX()/checkXX()/hasXX() 用於返回 Boolean 值的方法,如 isGirl(),hasPermission()
initXX() 初始化相關方法,如 initView()
loadXX()/handleXX() 讀取數據或者對數據處理時的方法,如 loadData()
disPlayXX()/showXX() 顯示相關信息,如 showToast()
... ...
通常方法的命名都是以動詞爲前綴,後面加上動做的對象。
常量名

常量名命名模式爲 CONSTANT_CASE,所有字母大寫,用下劃線分隔單詞。

// Constant
static final int NUMBER = 5;

// Not constant
static String nonFinal = "non-final";
這些名字一般是名詞或名詞短語。

每一個常量都是一個靜態final字段,但不是全部靜態final字段都是常量。在決定一個字段是不是一個常量時, 考慮它是否真的感受像是一個常量。

變量名

在Google其它編程語言風格中使用的特殊前綴或後綴,如name_, mName, s_name和kName,在Java編程風格中都再也不使用。
如今在 Android 很是量字段名的命名有兩種方式,一種是在特定的字段名上加上特殊前綴或後綴,如普通成員變量命名以 mCamelCase 樣式命名,靜態變量以 sCamelCase 命名。另外一種則是徹底使用 lowerCamelCase 命名,如 camelCase 變量名。

雖然兩種命名方式均可,但切記不要在同一個項目中同時使用,這樣只會讓代碼看得糟糕。固然我的推薦變量名以 lowerCamelCase 風格編寫。

參數名,局部變量名以 lowerCamelCase 風格編寫

臨時變量一般被取名爲i、j、k、m和n,它們通常用於整型;c、d、e,它們通常用於字符型。

類型變量可用如下兩種風格之一進行命名:

單個的大寫字母,後面能夠跟一個數字(如:E, T, X, T2)。
以類命名方式,後面加個大寫的T(如:RequestT, FooBarT)。
關於Android中相關控件的命名,控件變量命名能夠在後綴加上控件名稱或者控件名稱的縮寫,如login+Button=loginButton/loginBtn。日常習慣控件名縮寫的話推薦使用控件名稱的縮寫來做爲後綴。

Android 資源文件

Android資源文件基本上都採起使用下劃線_來鏈接詞語。

佈局文件 layout

必須所有單詞小寫,單詞間如下劃線分割,使用名詞或名詞詞組

界面相關佈局

命名方式爲 界面_模塊.xml
一般 Activity 或者 Fragment 等類名要與其佈局文件相對應,如:

LoginActivity.java -> activity_login.xml
BookFragment.java -> fragment_book.xml
DateDialog.java -> dialog_date.xml
SettingPopupWindow.java -> ppw_setting.xml

列表項佈局

命名方式爲 控件_模塊_item.xml

通常關於列表項的命名則以 item 做爲前綴,如:item_user.xml 表示這個佈局文件用在用戶列表中。

但我更喜歡下面這種方式的命名:
listview_user_item -> 表示這是用於 listview 的用戶列表項。
recyclerview_user_item -> 表示這是用於 recyclerview 的用戶列表項。
gridview_user_item -> 表示這是用於 gridview 的用戶列表項。

而此時你自定義了一個 GroupView 須要列表項去填充,好比說一個 RefreshLayout:
refresh_user_item -> 表示這是用於 RefreshLayout 的用戶列表項。

包含項

命名方式爲 模塊_描述.xml
在界面佈局中,如 activity_user_header 表示爲用戶界面的頭部佈局。
在列表佈局中,如 listview_user_header 表示爲用戶列表的頭部佈局。

圖片資源 drawable

所有小寫,採用下劃線命名法,加前綴區分

用途 命名規則 名稱
圖標 ic_模塊名[_用途] ic_home 或 ic_media_info
普通文件 模塊_用途[_狀態描述] search_background 或者 layerlist_progress_horizontal 或者 btn_xx_focused
動畫資源 anim

也是要所有小寫,使用下劃線來分隔詞組。
命名規則爲 模塊_用途[_狀態描述],如:

fade_out->淡出
push_down_in->從下方推入
菜單資源 menu

命名規則爲: menu_模塊[_用途]
如:menu_shelf -> 表示爲書架上的菜單選項
其中菜單內部的id命名規則爲 action_用途,如:action_manage

好吧,其實資源的命名沒有那麼多死板的規則,只要能看到本身命名的名字能立馬明白它的做用就好了。固然不止本身也必須讓團隊的其餘人能明白。

Values下的命名方式

色調(color)

禁止在layout直接使用 「#000000」 賦予顏色,
在你的colors.xml文件中應該只是映射顏色的名稱一個ARGB值,而沒有其它的。不要爲特定的UI定義特定的顏色值,這樣只會致使顏色值重複定義。

Don't

<color name="chapter_select_area_bg">#fff5f5f5</color>
    <color name="content_text_color">#ff404040</color>
    <color name="et_hit_text_color">#ffacacac</color>

Do

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#FF4081</color>

    <!-- 經常使用字體顏色 -->
    <color name="black">#000000</color>
    <color name="black_alpha">#8A000000</color>
    <color name="black_alpha_more">#64000000</color>
    <color name="black_normal">#DE000000</color>
    <color name="white">#FFFFFF</color>
    <color name="white_alpha">#8AFFFFFF</color>
    <color name="white_normal">#DEFFFFFF</color>
    <color name="white_normal_more">#33FFFFFF</color>
    <color name="white_less">#FFFAFA</color>


    <color name="transparent">#00000000</color>
</resources>

一個美觀的 app 是不會充斥太多無用的色彩的。
尺寸(dimen)

儘可能遵循 Material Design 的設計標準,好比字體的大小,頁面左右空白16dp,列表上下間隔8dp等。

<resources>

    <dimen name="horizontal_margin">16dp</dimen>
    <dimen name="vertical_margin">16dp</dimen>
    <dimen name="horizontal_padding">16dp</dimen>
    <dimen name="vertical_padding">16dp</dimen>
    <dimen name="fab_margin">16dp</dimen>

    <!-- 頁面統一間距 -->
    <dimen name="title_height">48dp</dimen>
    <dimen name="toolbar_height">48dp</dimen>
    <dimen name="tab_height">48dp</dimen>
    <dimen name="bar_height">56dp</dimen>
    <dimen name="edittext_height">56dp</dimen>
    <dimen name="caption_height">24dp</dimen>
    <dimen name="line_height">8dp</dimen>
    <dimen name="line_height_half">4dp</dimen>
    <dimen name="line_height_double">16dp</dimen>
    <dimen name="layout_height">72dp</dimen>

    <!-- 字體大小 -->
    <dimen name="text_display3">56sp</dimen>
    <dimen name="text_display2">45sp</dimen>
    <dimen name="text_display1">34sp</dimen>
    <dimen name="text_headline">24sp</dimen>
    <dimen name="text_title">20sp</dimen>
    <dimen name="text_subhead">16sp</dimen>
    <dimen name="text_body">14sp</dimen>
    <dimen name="text_caption">12sp</dimen>
    <dimen name="text_mini">10sp</dimen>
    <dimen name="text_menu">14sp</dimen>
    <dimen name="text_button">16sp</dimen>
    <dimen name="text_navi">18sp</dimen>

</resources>

儘可能不要直接在佈局文件裏面寫上具體的數值。
字符串(string)

strings的name命名使用下劃線命名法,採用如下規則:模塊名+邏輯名稱,
一樣,禁止在代碼中或者layout中直接填入字符,請在string.xml加入字符串。最好是按模塊來分隔開字符串便於查找和修改,公用的寫在最開始位置。

<resources>
    <string name="app_name">cpacm</string>

    <string name="open_string">open</string>
    <string name="close_string">close</string>

    <!--####################  Home模塊  #####################-->

    <!-- bottom navi -->
    <string name="free">休閒</string>
    <string name="news">資訊</string>
    <string name="beauty">風采</string>
    <string name="study">學習</string>
    <string name="contract">互動</string>

    <!--#####################  Free模塊  #####################-->
    <!-- tab -->
    <string name="music">音樂</string>
    <string name="movie">電影</string>
    <string name="book">圖書</string>

</resources>

全部文字放在 strings.xml 中能夠很方便的轉換多國語言。
樣式(style)

style的name命名使用大駝峯命名法。
當某部分xml屬性代碼重複過多時,請將其變成 style 以便重複利用。

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

自定義屬性(attr)

attr的name命名使用大駝峯命名法。
在自定義控件或其餘地方須要自定義屬性名稱時,除去直接加入attrs.xml中也能夠新建一個 attr 文件,並在 attr 後加上功能名稱。
如 attr_slider 表示一個輪播器控件的自定義屬性。

layout內的id命名

命名模式爲:模塊名_view縮寫,好比 search_btn

註釋

類註釋

每一個類都必需要寫上

建立時間
做者
類的做用描述
版本和聯繫方式(可選)
這樣團隊就能知道這個類的做用是什麼,原生產者是誰。

/**
 * <pre>
 *     author : cpacm
 *     e-mail : xxx@xx
 *     date   : 2017/03/21
 *     description   : xxxx描述
 *     version: 1.0
 * </pre>
 */
public class MainActivity {
      ...
}

在 Android Studio 中 Settings → Editor → File and Code Templates → Includes → File Header,輸入模板。

方法註釋

每一個成員方法都應該有一個頭註釋,告訴咱們這個方法作了什麼,返回了什麼。

/**
 * snackbar的顯示
 */
public void showSnackBar(View view, @StringRes int toast) {
    Snackbar.make(view, getString(toast), Snackbar.LENGTH_SHORT).show();
}

設置Fix doc comment(Settings → Keymap → Fix doc comment)快捷鍵,AS便會生成模板。

塊/行註釋

主要做用是爲一些代碼進行補充說明,防止本身或團隊的其餘人沒法理解代碼的含義。

//指向書城界面viewPager.setCurrentItem(2, false);總結上面的規範只是給個參考,適合本身或團隊纔是最好的。養成好的命名習慣才能寫出優美的代碼,這須要長時間的堅持才能培養出來。說實話,其實英語基礎纔是最重要的XD.Java 更多的編寫風格能夠參考:Google Java 命名規範

相關文章
相關標籤/搜索