html5中文学习网

您的位置: 首页 > android » 正文

Android中实现根据资源名获取资源ID_Android

[ ] 已经帮助:人解决问题

接触过Android开发的同学们都知道在Android中访问程序资源基本都是通过资源ID来访问。这样开发起来很简单,并且可以不去考虑各种分辨率,语言等不同资源显式指定。PySHTML5中文学习网 - HTML5先行者学习网

痛点PySHTML5中文学习网 - HTML5先行者学习网

但是,有时候也会有一些问题,比如我们根据服务器端的值取图片,但是服务器端绝对不会返回给我们的是资源id,最多是一种和文件名相关联的值,操作资源少的时候,可以维护一个容器进行值与资源ID的映射,但是多的话,就需要另想办法了。PySHTML5中文学习网 - HTML5先行者学习网

便捷的方法PySHTML5中文学习网 - HTML5先行者学习网

在这种情况下,使用文件名来得到资源ID显得事半功倍。 通过调用Resources的getIdentifier可以很轻松地得到资源ID。 几个简单的示例:PySHTML5中文学习网 - HTML5先行者学习网

复制代码 代码如下:
PySHTML5中文学习网 - HTML5先行者学习网
Resources res = getResources();PySHTML5中文学习网 - HTML5先行者学习网
final String packageName = getPackageName();PySHTML5中文学习网 - HTML5先行者学习网
int imageResId = res.getIdentifier("ic_launcher", "drawable", packageName);PySHTML5中文学习网 - HTML5先行者学习网
int imageResIdByAnotherForm = res.getIdentifier(packageName + ":drawable/ic_launcher", null, null);PySHTML5中文学习网 - HTML5先行者学习网
  PySHTML5中文学习网 - HTML5先行者学习网
int musicResId = res.getIdentifier("test", "raw", packageName);PySHTML5中文学习网 - HTML5先行者学习网
      PySHTML5中文学习网 - HTML5先行者学习网
int notFoundResId = res.getIdentifier("activity_main", "drawable", packageName);PySHTML5中文学习网 - HTML5先行者学习网

Log.i(LOGTAG, "testGetResourceIds imageResId = " + imageResIdPySHTML5中文学习网 - HTML5先行者学习网
              + ";imageResIdByAnotherForm = " + imageResIdByAnotherFormPySHTML5中文学习网 - HTML5先行者学习网
              + ";musicResId=" + musicResIdPySHTML5中文学习网 - HTML5先行者学习网
              + ";notFoundResId =" + notFoundResId);PySHTML5中文学习网 - HTML5先行者学习网

PySHTML5中文学习网 - HTML5先行者学习网

运行结果PySHTML5中文学习网 - HTML5先行者学习网

复制代码 代码如下:
PySHTML5中文学习网 - HTML5先行者学习网
I/MainActivity( 4537): testGetResourceIds imageResId = 2130837504;imageResIdByAnotherForm = 2130837504;musicResId=2130968576;notFoundResId =0PySHTML5中文学习网 - HTML5先行者学习网
PySHTML5中文学习网 - HTML5先行者学习网

看一看APIPySHTML5中文学习网 - HTML5先行者学习网

直接APIPySHTML5中文学习网 - HTML5先行者学习网

1.这个方法用来使用资源名来获取资源IDPySHTML5中文学习网 - HTML5先行者学习网
2.完整的资源名为package:type/entry,如果资源名这个参数有完整地指定,后面的defType和defPackage可以省略。PySHTML5中文学习网 - HTML5先行者学习网
3.defType和defPackage省略时,需要将其设置成nullPySHTML5中文学习网 - HTML5先行者学习网
4.注意这个方法不提倡,因为直接通过资源ID访问资源会更加效率高PySHTML5中文学习网 - HTML5先行者学习网
5.如果资源没有找到,返回0,在Android资源ID中0不是合法的资源ID。PySHTML5中文学习网 - HTML5先行者学习网

复制代码 代码如下:
PySHTML5中文学习网 - HTML5先行者学习网
**PySHTML5中文学习网 - HTML5先行者学习网
     * Return a resource identifier for the given resource name.  A fullyPySHTML5中文学习网 - HTML5先行者学习网
     * qualified resource name is of the form "package:type/entry".  The firstPySHTML5中文学习网 - HTML5先行者学习网
     * two components (package and type) are optional if defType andPySHTML5中文学习网 - HTML5先行者学习网
     * defPackage, respectively, are specified here.PySHTML5中文学习网 - HTML5先行者学习网
     * PySHTML5中文学习网 - HTML5先行者学习网
     * <p>Note: use of this function is discouraged.  It is much morePySHTML5中文学习网 - HTML5先行者学习网
     * efficient to retrieve resources by identifier than by name.PySHTML5中文学习网 - HTML5先行者学习网
     * PySHTML5中文学习网 - HTML5先行者学习网
     * @param name The name of the desired resource.PySHTML5中文学习网 - HTML5先行者学习网
     * @param defType Optional default resource type to find, if "type/" isPySHTML5中文学习网 - HTML5先行者学习网
     *                not included in the name.  Can be null to require anPySHTML5中文学习网 - HTML5先行者学习网
     *                explicit type.PySHTML5中文学习网 - HTML5先行者学习网
     * @param defPackage Optional default package to find, if "package:" isPySHTML5中文学习网 - HTML5先行者学习网
     *                   not included in the name.  Can be null to require anPySHTML5中文学习网 - HTML5先行者学习网
     *                   explicit package.PySHTML5中文学习网 - HTML5先行者学习网
     * PySHTML5中文学习网 - HTML5先行者学习网
     * @return int The associated resource identifier.  Returns 0 if no suchPySHTML5中文学习网 - HTML5先行者学习网
     *         resource was found.  (0 is not a valid resource ID.)PySHTML5中文学习网 - HTML5先行者学习网
     */PySHTML5中文学习网 - HTML5先行者学习网
    public int getIdentifier(String name, String defType, String defPackage) {PySHTML5中文学习网 - HTML5先行者学习网
        try {PySHTML5中文学习网 - HTML5先行者学习网
            return Integer.parseInt(name);PySHTML5中文学习网 - HTML5先行者学习网
        } catch (Exception e) {PySHTML5中文学习网 - HTML5先行者学习网
            // IgnorePySHTML5中文学习网 - HTML5先行者学习网
        }PySHTML5中文学习网 - HTML5先行者学习网
        return mAssets.getResourceIdentifier(name, defType, defPackage);PySHTML5中文学习网 - HTML5先行者学习网
    }PySHTML5中文学习网 - HTML5先行者学习网
PySHTML5中文学习网 - HTML5先行者学习网

间接APIPySHTML5中文学习网 - HTML5先行者学习网

实际上上述API调用的是AssetManager.class中的native方法。PySHTML5中文学习网 - HTML5先行者学习网

复制代码 代码如下:
PySHTML5中文学习网 - HTML5先行者学习网
/**PySHTML5中文学习网 - HTML5先行者学习网
     * Retrieve the resource identifier for the given resource name.PySHTML5中文学习网 - HTML5先行者学习网
     */PySHTML5中文学习网 - HTML5先行者学习网
    /*package*/ native final int getResourceIdentifier(String type,PySHTML5中文学习网 - HTML5先行者学习网
                                                       String name,PySHTML5中文学习网 - HTML5先行者学习网
                                                       String defPackage);PySHTML5中文学习网 - HTML5先行者学习网
PySHTML5中文学习网 - HTML5先行者学习网

(责任编辑:)
推荐书籍
推荐资讯
关于HTML5先行者 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助