最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android主項(xiàng)目與Module中R類的區(qū)別詳解

 更新時(shí)間:2018年02月25日 15:52:02   作者:CPPAlien  
這篇文章主要給大家介紹了關(guān)于Android主項(xiàng)目與Module中R類的區(qū)別的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)各位Android開發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。

前言

大家都知道 Android 項(xiàng)目中會(huì)通過自動(dòng)生成一個(gè) R.java 類的方式來保存項(xiàng)目中所有資源文件的標(biāo)識(shí)。在主項(xiàng)目中生成的 R.java 中的資源聲明是一個(gè)靜態(tài)常量,而在 module 中它卻是一個(gè)靜態(tài)變量。這是為什么呢?我們知道在 java 中如果某個(gè)值被聲明成常量(用 final 修飾),則在編譯后,該常量會(huì)被直接替換成值。而在 java 語(yǔ)法中,注解的屬性和 switch-case 中的 case 表達(dá)式,必須使用常量或者直接使用值,否則會(huì)報(bào)語(yǔ)法錯(cuò)誤。

下面我們會(huì)展開討論下為什么 module 中的 R 類中聲明的資源標(biāo)識(shí)不是 final 的,這些又導(dǎo)致了哪些現(xiàn)象?下面話不多說了,來一起看看詳細(xì)的介紹吧。

主項(xiàng)目中

比如你在主項(xiàng)目中創(chuàng)建了一個(gè) activity_main.xml 的布局文件,則 R.java 中會(huì)自動(dòng)加入一行如下靜態(tài)常量。

public static final class layout {
 ...
 public static final int activity_main=0x7f09001b;

此后你就可以通過 R.layout.activity_main 的方式使用該資源

public class MainActivity extends AppCompatActivity {
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
 }
}

我們編譯上述代碼后得到 MainActivity.class ,會(huì)發(fā)現(xiàn)里面的靜態(tài)常量被直接替換成了值。代碼運(yùn)行過程中,就可以直接通過值來找到對(duì)應(yīng)資源了。

public class MainActivity extends AppCompatActivity {
 public MainActivity() {
 }

 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  this.setContentView(2131296283);
 }
}

Module中

然后我們?cè)僭谝粋€(gè) module 中同樣創(chuàng)建一個(gè) MainActivity 和對(duì)應(yīng)的資源,我們查看該 module 下的 R.java 。

public static final class layout {
 ...
 public static int activity_main = 0x7f0f001c;

大家有發(fā)現(xiàn)區(qū)別了嗎?在 module 中添加的該資源少了 final。我們?cè)賮砜聪?MainActivity.class 文件。我們會(huì)發(fā)現(xiàn)此處的資源引用是使用的靜態(tài)變量方式,而未直接使用資源的值。

public class MainActivity extends AppCompatActivity {
 public MainActivity() {
 }

 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  this.setContentView(layout.activity_main);
 }
}

為什么這樣做

Android 中,如果你在 module 中添加了一個(gè)資源,就拿這里的 activity_main.xml 舉例。我們此處假設(shè)如果在 module 中也是 final 的,那會(huì)出現(xiàn)什么情況?第一,該 module 編譯后的代碼中該資源會(huì)被替換成值;第二,當(dāng)該 module 被添加到主項(xiàng)目中后,如果主項(xiàng)目中有一個(gè)同樣名稱的資源,那么 module 中的該資源就會(huì)被替換;第三,主項(xiàng)目中會(huì)重新針對(duì)該資源生成一個(gè) ID;最終就會(huì)出現(xiàn) module 中那個(gè)資源 ID 找不到了。所以呢,這也是為什么 module 中的資源 ID 聲明不使用 final 的原因。

有關(guān)資源合并的規(guī)則,可以參考下 google 的官方文檔

https://developer.android.com/studio/write/add-resources.html。

導(dǎo)致的幾個(gè)現(xiàn)象

1,這就是為什么當(dāng)主項(xiàng)目與 module 中有同樣資源時(shí),module 卻會(huì)使用主項(xiàng)目的資源。

2,這也是為什么我們?cè)?module 中無法針對(duì)資源使用 switch-case 方式的原因。

3,這也是為什么我們無法在 module 中直接使用 butterknife,因?yàn)樽⒔獾膶傩孕枰?final 的。當(dāng)然現(xiàn)在 butterknife 已經(jīng)提供了一個(gè)解決方案。就是利用 gradle 拷貝一份 R.java 命名成 R2.java,R2.java 里面的資源聲明都是 final 的。這樣就躲過了語(yǔ)法檢查。當(dāng)然使用butterknife編譯后的字節(jié)碼中使用的還是R.java中的資源聲明。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

最新評(píng)論

临潭县| 托克托县| 宣化县| 固阳县| 扬州市| 德昌县| 新和县| 绥滨县| 突泉县| 嘉峪关市| 合阳县| 收藏| 周至县| 交口县| 青海省| 嵊泗县| 嘉峪关市| 临夏县| 错那县| 仙居县| 玛纳斯县| 金堂县| 遂昌县| 江油市| 河间市| 正阳县| 杭州市| 汉寿县| 台东县| 合山市| 安庆市| 阳江市| 六安市| 十堰市| 晴隆县| 上杭县| 新乡县| 焉耆| 长岛县| 嘉鱼县| 崇礼县|