① 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);
}
}