Andoird开发一种富有成效的资源文件命名规则

364599638 9年前
   <p><img src="https://simg.open-open.com/show/e7b42a6e8ef99c9b772ef7c36c6aabe9.png"></p>    <p>你还记得最后一次在strings.xml中寻找要用的字符串吗?还记得自己最后一次不得不浏览完所有的drawable才找到想要的那个图标吗?</p>    <p>每当开始一个新的项目,我们总是化太多心思到配置和架构上,但是对于资源文件的命名,你有自己的一套对策吗?</p>    <p>其实你应该有才对!因为如果缺乏xml的命名规则会让安卓资源文件的管理混乱,尤其是在大项目中。</p>    <p>那么就让我们来介绍一个可以减轻你痛苦的简单方案吧。</p>    <p>这篇博客将阐述其机制、好处、限制,并提供一个可随时查阅的清单。</p>    <h2>基本准则</h2>    <p>所有的资源文件名称都遵循一个简单的约定。</p>    <p><img src="https://simg.open-open.com/show/01f0ded6c41b59cb05f9e712d48ad95e.jpg"></p>    <p>我们首先简明的描述一下每个元素。然后列举这样做的好处,之后我们将演示如何把它应用到各种类型的资源文件中。</p>    <p><WHAT></p>    <p>表示到底代表的是什么资源,通常是一个标准的安卓View类,或者能代表view的类。(e.g. MainActivity -> activity)</p>    <p><WHERE></p>    <p>表示它属于app的什么地方。在多个页面使用的资源用all,其它的使用它们所在页面名称的自定义部分(e.g. MainActivity -> main, ArticleDetailFragment -> articledetail)。</p>    <p><DESCRIPTION></p>    <p>区分同一界面的不同元素</p>    <p>(e.g. title)</p>    <p><SIZE> (可选)</p>    <p>可以是准确的大小也可以是描述大小的文字。可以选择性的用在drawable和dimension上。</p>    <p>(e.g. 24dp, small))</p>    <p><img src="https://simg.open-open.com/show/fb7e9bcf9cdd15276e4aba86fb0d764d.png"></p>    <p>可以下载和打印我提供的 <a href="http://www.open-open.com/doc/view/220292249ea94b99b3dbf28c4a3b56dd">备忘清单</a> 方便随时查阅。</p>    <h2>好处</h2>    <ol>     <li> <p>按页面组织资源</p> <p>WHERE部分描述了一个资源所属的页面。因此可以很容易识别出一个特定页面的所有ID, drawable, dimension。</p> </li>     <li> <p>一眼就能从资源ID判断出类型</p> <p>对于资源id,WHAT部分描述了这个id所属的xml元素的类名。这样可以让你更容易知道findViewById()调用之后应该转换成什么类。</p> </li>     <li> <p>Better resource organizing</p> <p>File browsers/project navigator通常按照字母顺序排列文件。这意味着布局和drawable是按照他们的 WHAT(activity, fragment,..) 和 WHERE前缀组织的。现在有一个简单的Android Studio插件可以让这些资源看起来就像在自己的文件夹里面一样。</p> </li>     <li> <p>提高自动补全的效率</p> <p>因为资源名称非常好预测,使得ide的自动补全更容易了。通常输入WHAT或者 WHERE就足以把自动补全的提示缩小到很窄的范围了。</p> </li>     <li> <p>不再有命名冲突</p> <p>不同页面之间相似的资源具有不同的where,或者是使用all。</p> </li>     <li> <p>更清晰的命名</p> <p>总体来说资源文件的命名更加有逻辑,使得项目更清晰。</p> </li>     <li> <p>Tools support</p> <p>This naming scheme could be easily supported by the Android Studio offering features such as: lint rules to enforce these names, refactoring support when you change a WHAT or WHERE, better resource visualisation in project view,...</p> </li>    </ol>    <h2>LAYOUTS</h2>    <p>布局的命名相对简单,因为通常一个页面只有很少的布局。因此规则可以简化成:</p>    <p><img src="https://simg.open-open.com/show/cf081ef2530e25b40aaf528033887ad5.png"></p>    <p>其中<WHAT>可以是以下名称之一:</p>    <table>     <thead>      <tr>       <th>前缀</th>       <th>用处</th>      </tr>     </thead>     <tbody>      <tr>       <td>activity</td>       <td>activity的布局</td>      </tr>      <tr>       <td>fragment</td>       <td>fragment的布局</td>      </tr>      <tr>       <td>view</td>       <td>一个自定义view所要inflated的布局</td>      </tr>      <tr>       <td>item</td>       <td>recycler或者gridview中使用的布局</td>      </tr>      <tr>       <td>layout</td>       <td>include标签中用来重用的布局</td>      </tr>     </tbody>    </table>    <p>例子:</p>    <ul>     <li> <p>activity_main: MainActivity的布局</p> </li>     <li> <p>fragment_articledetail:  ArticleDetailFragment的布局</p> </li>     <li> <p>view_menu: 被自定义view:MenuView所inflate的布局</p> </li>     <li> <p>item_article: ArticleRecyclerView中的item</p> </li>     <li> <p>layout_actionbar_backbutton:带有返回按钮的actionbar的布局</p> </li>    </ul>    <h2>STRINGS</h2>    <p>Strings的<WHAT>部分无关紧要。所以你要么使用<WHERE>表明string被使用的地方:</p>    <p><img src="https://simg.open-open.com/show/e7a8de0623794f4f32c06b5f877177aa.png"></p>    <p>要么使用all表示整个app都要使用这个string:</p>    <p><img src="https://simg.open-open.com/show/ba62e1ff14bc3820e369cf1f57d40f6c.png"></p>    <p>Examples:</p>    <ul>     <li> <p>articledetail_title: ArticleDetailFragment的标题</p> </li>     <li> <p>feedback_explanation:  FeedbackFragment中的feedback explanation</p> </li>     <li> <p>feedback_namehint: hint of name field in FeedbackFragment</p> </li>     <li> <p>all_done: 通用的 "done" 字符。</p> </li>    </ul>    <p>很明显同一视图下的资源<WHERE>都是一样的。</p>    <h2>DRAWABLES</h2>    <p>Drawables的<WHAT>也不重要。所以要么使用<WHERE>表明drawable被使用的地方:</p>    <p><img src="https://simg.open-open.com/show/ccc8df8835020c3b7f0f5252fc58c764.png"></p>    <p>要么使用all表示整个app都要使用这个drawable:</p>    <p><img src="https://simg.open-open.com/show/3388441094874bf180eb878439dc72ae.png"></p>    <p>还可以选择性的添加<SIZE>元素,可以是准确的大小如“24dp”也可以是大小修饰词如“small”。</p>    <p>Examples:</p>    <ul>     <li> <p>articledetail_placeholder: placeholder in ArticleDetailFragment</p> </li>     <li> <p>all_infoicon: generic info icon</p> </li>     <li> <p>all_infoicon_large: large version of generic info icon</p> </li>     <li> <p>all_infoicon_24dp: 24dp version of generic info icon</p> </li>    </ul>    <h2>IDS</h2>    <p>对于ID,<WHAT>指的是它所属的xml元素的类名。然后是id所在的页面,最后可以选择性的跟上一个描述,以区别同一页面的相似元素。</p>    <p><img src="https://simg.open-open.com/show/5f6c9bec01f101dece5e38a51cf6cd24.png"></p>    <p>例子:</p>    <ul>     <li> <p>tablayout_main -> MainActivity中的TabLayout</p> </li>     <li> <p>imageview_menu_profile -> 自定义MenuView中的profile image</p> </li>     <li> <p>textview_articledetail_title ->ArticleDetailFragment中标题对应的TextView</p> </li>    </ul>    <h2>DIMENSIONS</h2>    <p>app应该只定义一套数量有限的常用dimension,这个特性使得dimension一般都默认用all。</p>    <p>因此你最常用的是:</p>    <p><img src="https://simg.open-open.com/show/4582e2cfe33a378f237266144beb50be.png"></p>    <p>偶尔也可以指定具体的页面:</p>    <p><img src="https://simg.open-open.com/show/c3ec8092ff78b4ffd9adee31fd122e90.png"></p>    <p>其中<WHAT>是以下名称之一:</p>    <table>     <thead>      <tr>       <th>Prefix</th>       <th>Usage</th>      </tr>     </thead>     <tbody>      <tr>       <td>width</td>       <td>width in dp</td>      </tr>      <tr>       <td>height</td>       <td>height in dp</td>      </tr>      <tr>       <td>size</td>       <td>if width == height</td>      </tr>      <tr>       <td>margin</td>       <td>margin in dp</td>      </tr>      <tr>       <td>padding</td>       <td>padding in dp</td>      </tr>      <tr>       <td>elevation</td>       <td>elevation in dp</td>      </tr>      <tr>       <td>keyline</td>       <td>absolute keyline measured from view edge in dp</td>      </tr>      <tr>       <td>textsize</td>       <td>size of text in sp</td>      </tr>     </tbody>    </table>    <p>注意这里只包含了最常用的<WHAT>。其它dimension描述如:rotation, scale,...通常只用在drawable上,而且也是很少用。</p>    <p>例子:</p>    <ul>     <li> <p>height_toolbar: toolbar的高度</p> </li>     <li> <p>keyline_listtext: listitem text所要对齐的keyline</p> </li>     <li> <p>textsize_medium: 所有文字的中等大小</p> </li>     <li> <p>size_menu_icon: 菜单中图标的大小</p> </li>     <li> <p>height_menu_profileimage: 菜单中profile image的高度</p> </li>    </ul>    <h2>已知的缺陷</h2>    <ol>     <li> <p>页面必须具有唯一的名称</p> <p>了避免<WHERE>参数发生冲突,View(以及可以代表View)的类必须具有独有的名称。所以你不能同时有“MainActivity”和 "MainFragment",因为 "Main" 前缀不再能够识别出一个<WHERE>了。ps:这点其实可以灵活的处理,一般这种情况发生在不需要what的情况下,其实这个时候where我们可以用activity_main来表示,而不是main。</p> </li>     <li> <p>不支持重命名</p> <p>修改类的名称并不能同步修改资源名称。所以如果你把 "MainActivity" 改为 "ContentActivity",布局"activity_main"并不会重命名为"activity_content"。希望哪天Android Studio能添加这种支持。ps:这不算是缺陷吧,又不是这种命名规则引起的。</p> </li>     <li> <p>不能支持所有的资源类型</p> <p>这种规则当前不支持所有的资源类型。主要是有些资源不常用(比如raw 和 assets),还有些资源不是很好归纳(比如:themes/styles/colors/animations)。</p> </li>    </ol>    <h2>WRAP-UP</h2>    <p>以上就是本文的内容。一个简单易用的资源文件命名规则。别忘了下载 <a href="http://www.open-open.com/doc/view/220292249ea94b99b3dbf28c4a3b56dd" rel="nofollow,noindex">cheat sheet</a> 方便查阅哦!</p>    <p>虽然这种规则并不覆盖所有的资源类型,但是它的确提供了一种解决了绝大多数命名问题的方法。</p>    <p> </p>    <p>来自:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2016/1104/6745.html</p>    <p> </p>