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

 更新时间:2015年01月16日 13:18:37   投稿:junjie  
这篇文章主要介绍了Android中实现根据资源名获取资源ID,本文讲解了使用文件名获取资源ID的方法,需要的朋友可以参考下

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

痛点

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

便捷的方法

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

复制代码 代码如下:

Resources res = getResources();
final String packageName = getPackageName();
int imageResId = res.getIdentifier("ic_launcher", "drawable", packageName);
int imageResIdByAnotherForm = res.getIdentifier(packageName + ":drawable/ic_launcher", null, null);
 
int musicResId = res.getIdentifier("test", "raw", packageName);
     
int notFoundResId = res.getIdentifier("activity_main", "drawable", packageName);

Log.i(LOGTAG, "testGetResourceIds imageResId = " + imageResId
              + ";imageResIdByAnotherForm = " + imageResIdByAnotherForm
              + ";musicResId=" + musicResId
              + ";notFoundResId =" + notFoundResId);

运行结果

复制代码 代码如下:

I/MainActivity( 4537): testGetResourceIds imageResId = 2130837504;imageResIdByAnotherForm = 2130837504;musicResId=2130968576;notFoundResId =0

看一看API

直接API

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

复制代码 代码如下:

**
     * 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.)
     */
    public int getIdentifier(String name, String defType, String defPackage) {
        try {
            return Integer.parseInt(name);
        } catch (Exception e) {
            // Ignore
        }
        return mAssets.getResourceIdentifier(name, defType, defPackage);
    }

间接API

实际上上述API调用的是AssetManager.class中的native方法。

复制代码 代码如下:

/**
     * Retrieve the resource identifier for the given resource name.
     */
    /*package*/ native final int getResourceIdentifier(String type,
                                                       String name,
                                                       String defPackage);

相关文章

  • Android获取ROOT权限的实例代码

    Android获取ROOT权限的实例代码

    这篇文章主要介绍了Android如何获取ROOT权限,写了一个小方法,大家可以在应用中检测ROOT权限
    2013-11-11
  • MacBook M1 Flutter环境搭建的实现步骤

    MacBook M1 Flutter环境搭建的实现步骤

    本文主要介绍了MacBook M1 Flutter环境搭建,Flutter官方和各项配套的软件环境也还没有成熟,导致搭建环境时碰到了不少坑,本文就详细的介绍一下
    2021-08-08
  • 快速了解Android Room使用细则

    快速了解Android Room使用细则

    这篇文章主要为大家介绍了快速了解Android Room使用细则,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Android利用WindowManager生成悬浮按钮及悬浮菜单

    Android利用WindowManager生成悬浮按钮及悬浮菜单

    这篇文章主要为大家详细介绍了Android利用WindowManager生成悬浮按钮及悬浮菜单,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • Android中卡顿优化布局详细介绍

    Android中卡顿优化布局详细介绍

    大家好,本篇文章主要讲的是Android中卡顿优化布局详细介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • Android开发之手势检测及通过手势实现翻页功能的方法

    Android开发之手势检测及通过手势实现翻页功能的方法

    这篇文章主要介绍了Android开发之手势检测及通过手势实现翻页功能的方法,结合实例形式分析了Android GestureDetector类实现手势检测功能的相关操作技巧,需要的朋友可以参考下
    2017-09-09
  • Android Webview滑进出屏幕闪烁的解决方法

    Android Webview滑进出屏幕闪烁的解决方法

    这篇文章主要给大家介绍了关于Android Webview滑进出屏幕闪烁的解决方法,文中通过示例代码介绍的非常详细,对各位Android开发者们具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03
  • 5分钟快速实现Android爆炸破碎酷炫动画特效的示例

    5分钟快速实现Android爆炸破碎酷炫动画特效的示例

    本篇文章主要介绍了5分钟快速实现Android爆炸破碎酷炫动效的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • 使用Flutter实现一个走马灯布局的示例代码

    使用Flutter实现一个走马灯布局的示例代码

    这篇文章主要介绍了使用 Flutter 实现一个走马灯布局的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • RecyclerView设置间距和添加分割线的方法

    RecyclerView设置间距和添加分割线的方法

    在使用RecyclerView布局,经常需要调整间距和添加分割线以达到更美观效果,这篇文章主要介绍了RecyclerView设置间距和添加分割线的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09

最新评论