① android開發中R資源引用注意事項
在Android開發中,正確引用資源對於構建功能完備、運行流暢的應用至關重要。為了確保代碼的穩定性和資源的高效管理,我們需要遵循一些關鍵的注意事項。本文將通過一個簡單的示例來探討Android開發中資源引用的要點,尤其是涉及到資源ID的獲取和資源文件的導入或引用。
首先,了解資源打包過程是基礎。當我們在Android項目中進行編譯時,會使用aapt(Android Asset Packaging Tool)對資源進行打包,生成R.java文件和資源索引表resource.arsc。R.java文件包含了非assets下所有資源的ID值,而resource.arsc則是資源的索引表。程序在運行時,通過R.java獲取特定資源ID,再通過resource.arsc查找對應資源。
接下來,我們通過一個具體的例子來說明資源引用的常見問題和解決策略。假設我們有兩個項目,Sample和SampleLib。Sample項目直接引用SampleLib或導入SampleLib的jar包,以使用SampleLib中定義的介面。為了測試資源引用的注意事項,我們創建了一個簡單的示例,包括一個類和兩個介面,分別用於通過直接引用和代碼方式返回drawable目錄下名為「test」的圖片ID。
在運行應用時,我們發現直接引用和導入jar包的方式都能正確獲取圖片ID,但存在一些陷阱。當通過導入jar包的方式接入時,如果SampleLib中直接引用了R資源,可能會導致閃退。這是因為在導出jar包時,資源ID沒有被正確地插入到Sample的R.java文件中,導致資源檢索時出現問題。
為了解決這一問題,我們可以通過以下步驟進行:
1. **開發SDK時,避免直接引用R資源**:在開發SDK時,應避免直接引用R資源,而是通過代碼方式獲取資源ID。這樣可以確保資源ID的一致性和避免導入SDK時的潛在問題。
2. **接入SDK時的策略**:在接入第三方SDK時,可以選擇直接引用SDK項目的方式,以避免資源ID問題。如果直接引用R資源,確保SDK的資源ID與應用項目的R.java文件中的資源ID保持一致。
3. **處理資源引用的特殊情況**:在某些情況下,可能需要導入jar包而不直接引用SDK項目。這時,可以創建一個新的項目,將包名與SDK的包名保持一致,然後導入必要的文件和資源,再在應用項目中引用這個新建的項目。這樣可以確保資源ID的一致性和正確的資源檢索。
通過這些策略,我們可以有效地管理資源引用,避免在開發過程中遇到的問題。理解這些注意事項不僅有助於提高代碼質量和應用性能,還能確保項目的穩定性和兼容性。
本文提供了一個實用的示例,旨在幫助開發人員在實際項目中正確地引用資源,解決常見問題,並通過代碼和資源管理的最佳實踐來優化應用開發流程。在處理資源引用時,遵循上述建議可以幫助開發者避免常見的錯誤,確保應用的順利運行和用戶滿意度。
請注意,本文內容是基於實際開發經驗總結的指導性信息,旨在提供實用的建議而非詳細的代碼示例。對於具體的開發環境和項目需求,開發者應根據實際情況進行相應的資源管理策略調整。
② Android項目中如何使用資源文件
Android SDK在編譯應用時會在R類中為/res/目錄下的所有資源創建索引項,因此在java代碼中訪問資源主要是通過R類來完成。
語法格式為:
package_name.R.resource_type.resource_name
package_name:指定R類所在的包,實際上就是使用全限定類名。不過,要是在java程序中已導入R類所在包,可以省略包名。
resource_type:R類中代表不同資源類型的子類,例如string代表字元串資源。
resource_name:指定資源的名稱。
//從drawable資源中載入圖片,並設為該窗口的背景
getWindow().setBackgroundDrawableResource(R.drawable.back);
//從string資源中獲取指定字元串源碼,並設置該窗口的標題
getWindow().setTitle(getResources().getText(R.string.main_title));
③ android 怎麼在代碼中引用assets中的資源
1。獲取資源的輸入流
資源文件 sample.txt 位於 $PROJECT_HOME/assets/ 目錄下,可以在 Activity 中通過
Context.getAssets().open(「sample.txt」)
方法獲取輸入流。
注意:如果資源文件是文本文件則需要考慮文件的編碼和換行符。建議使用UTF-8和Unix換行符。
2. WebView 載入assets目錄下的html文件
資源文件 sample.html 位於 $PROJECT_HOME/assets/ 目錄下,可以通過以下代碼
WebView.loadUrl(「file:///android_asset/sample.html」);
載入html文件。
④ 如何在一個android工程中調用另一個android工程的代碼和資源啊
現在已經有了一個Android工程A。我們想擴展A的功能,但是不想在A的基礎上做開發,於是新建了另外一個Android工程B,想在B中引用A。
1. 把工程A做成純Jar包,這樣其他的工程就可以直接引用了。
但是,如果在工程A中用了R.java中的引用,則無法打成jar包了。原因是R.java是自動生成的,是動態的,每次編譯都是不相同的。如果一定要做成jar包,就不能使用自動生成的R文件,用到資源時候就要寫代碼去獲取。
有時會報錯:Conversion to Dalvik format failed with error 1
可能是多層包文件重復導入,沖突。。。
這時可以試試方法2
2.將工程A做成android library project。
設置工程A,右鍵->Properties->Android,將Is library項選中,然後Apply。設置工程B,右鍵->Properties->Android,在Library中,點擊Add按鈕,將A工程加入,然後Apply。此時在B中就引入了A中的資源和代碼,這些資源和代碼都可以直接調用。需要注意的是,因為A已經不再是一個完整的Android應用,而是一個類庫工程,所以有一些內容還需要在B中配置一下。比如A中有lib庫引用,則B中也要加入該lib庫;比如A中的AndroidManifest.xml文件的內容,在B的AndroidManifest.xml文件中也要相應加上。。。
如果不需要引用A工程的資源文件,同樣只需得到jar文件,
設置工程A,右鍵->Properties->Android,將Is library項選中,然後Apply。在A工程的bin目錄下能得到一個jar文件,可以到B工程中的libs目錄下直接引用。
如果能用jar當然最好,但是jar文件不能把res目錄下的資源打包進去,所以才出現lib工程。
創建和使用Android library工程
摘要: 創建library供多個工程共享代碼、資源是非常常見的需求,網上這種資料非常少,基本上都是講創建java工程,然後export,這種方式缺點非常多,大家可以自己google一下。本文著重介紹如何創建Android library,並且在 ...
創建library供多個工程共享代碼、資源是非常常見的需求,網上這種資料非常少,基本上都是講創建java工程,然後export,這種方式缺點非常多,大家可以自己google一下。
本文著重介紹如何創建Android library,並且在工程中使用此library提供的資源,具體步驟如下:
1. 創建一個Android工程,命名為MyLib
2. 進入工程設置選中Is Library
3. 創建另一個Android工程,命名為MyProj
4. 進入工程設置,添加MyLib
5. 在MyProj的AndroidManifest.xml中加入對library中activity的引用
<activity android:name="net.devdiv.mylib.MyLib" />
6. 由於編譯後library中的資源和引用它的project資源是合並在一起的,為了避免重名問題,需要對library中資源進行重命名
1). 把main.xml改為mylib.xml,同時修改MyLib.java代碼setContentView(R.layout.mylib);
2). strings.xml修改為
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="mylibhello">String fetched from lib!</string>
<string name="mylib_app_name">MyLib</string>
</resources>
7. 在MyProj中引用MyLib的資源
package net.devdiv.myproj;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import net.devdiv.mylib.*;
import android.content.Intent;
public class MyProj extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView tv = (TextView)findViewById(R.id.myprojtext);
tv.setText(R.string.mylibhello);
Intent it = new Intent(this, MyLib.class);
startActivity(it);
}
}