欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

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

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

主項目中

比如你在主項目中創(chuàng)建了一個 activity_main.xml 的布局文件,則 R.java 中會自動加入一行如下靜態(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 ,會發(fā)現(xiàn)里面的靜態(tài)常量被直接替換成了值。代碼運行過程中,就可以直接通過值來找到對應(yīng)資源了。

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

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

Module中

然后我們再在一個 module 中同樣創(chuàng)建一個 MainActivity 和對應(yīng)的資源,我們查看該 module 下的 R.java 。

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

大家有發(fā)現(xiàn)區(qū)別了嗎?在 module 中添加的該資源少了 final。我們再來看下 MainActivity.class 文件。我們會發(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 中添加了一個資源,就拿這里的 activity_main.xml 舉例。我們此處假設(shè)如果在 module 中也是 final 的,那會出現(xiàn)什么情況?第一,該 module 編譯后的代碼中該資源會被替換成值;第二,當該 module 被添加到主項目中后,如果主項目中有一個同樣名稱的資源,那么 module 中的該資源就會被替換;第三,主項目中會重新針對該資源生成一個 ID;最終就會出現(xiàn) module 中那個資源 ID 找不到了。所以呢,這也是為什么 module 中的資源 ID 聲明不使用 final 的原因。

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

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

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

1,這就是為什么當主項目與 module 中有同樣資源時,module 卻會使用主項目的資源。

2,這也是為什么我們在 module 中無法針對資源使用 switch-case 方式的原因。

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

總結(jié)

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

相關(guān)文章

  • Kotlin?this關(guān)鍵字的使用實例詳解

    Kotlin?this關(guān)鍵字的使用實例詳解

    這篇文章主要介紹了Kotlin?this關(guān)鍵字的使用實例,在Kotlin中,this關(guān)鍵字允許我們引用一個類的實例,該類的函數(shù)恰好正在運行。此外,還有其他方式可以使this表達式派上用場
    2023-02-02
  • Android xUtils更新到3.0后的基本使用規(guī)則詳解

    Android xUtils更新到3.0后的基本使用規(guī)則詳解

    xUtils是基于android的開發(fā)框架,簡化了很多的開發(fā)步驟,可以說是非常好的開發(fā)工具。下面小編給大家?guī)砹薃ndroid xUtils更新到3.0后的基本使用規(guī)則詳解,感興趣的朋友一起學(xué)習吧
    2016-08-08
  • Flutter使用AnimatedBuilder實現(xiàn)動效復(fù)用

    Flutter使用AnimatedBuilder實現(xiàn)動效復(fù)用

    Animation和AnimationWidget都是將組件和動畫一起完成的。有些時候,我們只是想動效復(fù)用,而不關(guān)心組件構(gòu)建,這個時候就可以使用 AnimatedBuilder了。本文詳細講解了AnimatedBuilder的使用,需要的可以參考一下
    2022-04-04
  • Android中BroadcastReceiver案例講解

    Android中BroadcastReceiver案例講解

    今天小編就為大家分享一篇關(guān)于Android中BroadcastReceiver案例講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Android  LayoutInflater.inflate源碼分析

    Android LayoutInflater.inflate源碼分析

    這篇文章主要介紹了Android LayoutInflater.inflate源碼分析的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • Android Service開發(fā)應(yīng)用實例

    Android Service開發(fā)應(yīng)用實例

    Android的服務(wù)是開發(fā)Android應(yīng)用程序的重要組成部分。不同于活動Activity,服務(wù)是在后臺運行,服務(wù)沒有接口,生命周期也與活動Activity非常不同。通過使用服務(wù)我們可以實現(xiàn)一些后臺操作,比如想從遠程服務(wù)器加載一個網(wǎng)頁等,下面來看看詳細內(nèi)容,需要的朋友可以參考下
    2022-12-12
  • Flutter路由fluro引入配置和使用的具體方法

    Flutter路由fluro引入配置和使用的具體方法

    Flutter本身提供了路由機制,本文主要介紹了Flutter fluro配置使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Android利用繪制緩沖實現(xiàn)代碼雨效果

    Android利用繪制緩沖實現(xiàn)代碼雨效果

    看過很多代碼雨的前端實現(xiàn),卻很少看到過Android代碼雨效果的實現(xiàn),當然 open gl es的實現(xiàn)是有的,一個主要的原因是,在Android Canvas繪制時,很少有人考慮使用繪制緩沖,所以本文將給大家介紹Android如何利用繪制緩沖實現(xiàn)代碼雨效果,需要的朋友可以參考下
    2024-03-03
  • android 6.0 權(quán)限授權(quán)方法

    android 6.0 權(quán)限授權(quán)方法

    今天小編就為大家分享一篇android 6.0 權(quán)限授權(quán)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • 獲取Activity棧,判斷當前Activity位置的方法

    獲取Activity棧,判斷當前Activity位置的方法

    下面小編就為大家分享一篇獲取Activity棧,判斷當前Activity位置的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03

最新評論