1 getIdentifier是安卓开发一个非常有用的方法,它属于Context类,用于根据资源的名称和类型动态获取资源的id,常用于跨模块和获取系统的资源id等。
vbnet
/**
* Return a resource identifier for the given resource name. A fully
* qualified resource name is of the form "package:type/entry". The first
* two components (package and type) are optional if defType and
* defPackage, respectively, are specified here.
*
* <p>Note: use of this function is discouraged. It is much more
* efficient to retrieve resources by identifier than by name.
*
* @param name The name of the desired resource.
* @param defType Optional default resource type to find, if "type/" is
* not included in the name. Can be null to require an
* explicit type.
* @param defPackage Optional default package to find, if "package:" is
* not included in the name. Can be null to require an
* explicit package.
*
* @return int The associated resource identifier. Returns 0 if no such
* resource was found. (0 is not a valid resource ID.)
*/
@Discouraged(message = "Use of this function is discouraged because resource reflection makes "
+ "it harder to perform build optimizations and compile-time "
+ "verification of code. It is much more efficient to retrieve "
+ "resources by identifier (e.g. `R.foo.bar`) than by name (e.g. "
+ "`getIdentifier("bar", "foo", null)`).")
public int getIdentifier(String name, String defType, String defPackage) {
return mResourcesImpl.getIdentifier(name, defType, defPackage);
}
name:资源的名称,即在res目录下的资源文件的名称,例如"id_test" defType:资源的类型,例如drawable,layout,string等。 defPackage 资源所在的包名。 如果找不到对应的资源,此方法会返回0。
ini
val resourceId = resources.getIdentifier("id_test", "string", packageName)
if (resourceId !== 0) {
val textString = resources.getString(resourceId)
Log.d("zhangqing", "[onCreate] resourceId=$textString")
} else {
// 资源不存在
Log.d("zhangqing", "[onCreate] resourceId no found")
}
xml
<resources>
<string name="app_name">KotlinDemoTest</string>
<string name="id_test">我爱安卓</string>
</resources>
另外
ini
val getResourceName = resources.getResourceName(resourceId)
val getResourceEntryName = resources.getResourceEntryName(resourceId)
val getResourcePackageName = resources.getResourcePackageName(resourceId)
val getResourceTypeName = resources.getResourceTypeName(resourceId)
Log.d("zhangqing", "[onCreate] getResourceName=$getResourceName")
Log.d("zhangqing", "[onCreate] getResourceEntryName=$getResourceEntryName")
Log.d("zhangqing", "[onCreate] getResourcePackageName=$getResourcePackageName")
Log.d("zhangqing", "[onCreate] getResourceTypeName=$getResourceTypeName")
有时我们在一个应用程序中访问另一个应用程序的资源或上下文,这时我们需要使用createPackageContext()方法,这个方法允许我们获取其他应用的上下文,并且使用这个上下文访问其资源。