Android使用getIdentifier()方法根据资源名来获取资源id

有时候我们想动态的根据一个资源名获得到对应的资源id,就可以使用getResources().getIdentifier()方法来获取该id。然后再使用该id进行相关的操作。

1、Demo示例

下面用一个小Demo来讲解如何使用getResources().getIdentifier()方法来获取该id。

例如,新建一个Android项目,项目结构部分截图如下所示:

MainActivity代码如下:

package com.oyp.demo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.ImageView;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = MainActivity.class.getSimpleName();

    private ImageView mImageView;

    private ImageView mipmapImageView;

    private TextView mTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //获取布局文件资源的ID
        int layoutId = getResources().getIdentifier("activity_main", "layout", getPackageName());
        Log.d(TAG, "----> 获取到的图片资源 drawableId= " + layoutId);

        //获取图片资源的ID
        mImageView = (ImageView) findViewById(R.id.imageView);
        int drawableId = getResources().getIdentifier("oyp", "drawable", getPackageName());
        mImageView.setImageResource(drawableId);
        Log.d(TAG, "----> 获取到的图片资源 drawableId=" + drawableId);

        mipmapImageView = (ImageView) findViewById(R.id.mipmapImageView);
        int mipmapId = getResources().getIdentifier("ic_launcher", "mipmap", getPackageName());
        mipmapImageView.setImageResource(mipmapId);
        Log.d(TAG, "----> 获取到的图片资源 mipmapId=" + mipmapId);

        //获取字符串资源
        mTextView = (TextView) findViewById(R.id.textView);
        int stringId = getResources().getIdentifier("author", "string", getPackageName());
        mTextView.setText(stringId);
        Log.d(TAG, "----> 获取到的字符串资源 stringId=" + stringId);
    }
}

布局文件代码如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.oyp.demo.MainActivity">

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:text="@string/title" />
    <ImageView
        android:id="@+id/mipmapImageView"
        android:layout_below="@id/title"
        android:layout_marginTop="40dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"/>

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/imageView"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="50dip" />

</RelativeLayout>

用到的strings.xml字符串资源代码如下:

<resources>

    <string name="app_name">Demo</string>
    <string name="title">利用getIdentifier()方法获取资源ID</string>
    <string name="author">欧阳鹏 http://blog.csdn.net/ouyang_peng</string>

</resources>

运行该程序,运行效果如下所示:

打印出来的log为:

11-24 22:15:02.471 12023-12023/com.oyp.demo D/MainActivity: ----> 获取到的图片资源 drawableId= 2130968601
11-24 22:15:02.476 12023-12023/com.oyp.demo D/MainActivity: ----> 获取到的图片资源 drawableId=2130837579
11-24 22:15:02.477 12023-12023/com.oyp.demo D/MainActivity: ----> 获取到的图片资源 mipmapId=2130903040
11-24 22:15:02.477 12023-12023/com.oyp.demo D/MainActivity: ----> 获取到的字符串资源 stringId=2131099669

我们打开编译好后的 com.oyp.demo.R文件

首先来看看activity_main这个layout的id是不是和我们打印出来的一样是2130968601,如下图所示,在 com.oyp.demo.R文件中,activity_main的值确实是2130968601

部分代码如下所示:

public static final class layout {
        ......

        public static final int abc_screen_simple = 2130968595;
        public static final int abc_screen_simple_overlay_action_mode = 2130968596;
        public static final int abc_screen_toolbar = 2130968597;
        public static final int abc_search_dropdown_item_icons_2line = 2130968598;
        public static final int abc_search_view = 2130968599;
        public static final int abc_select_dialog_material = 2130968600;
        public static final int activity_main = 2130968601;
        public static final int notification_media_action = 2130968602;
        public static final int notification_media_cancel_action = 2130968603;
        public static final int notification_template_big_media = 2130968604;
        public static final int notification_template_big_media_narrow = 2130968605;

        ......

        public layout() {
        }
    }

drawable类型的图片 ic_launcher 的资源id 为 2130903040

 public static final class mipmap {
        public static final int ic_launcher = 2130903040;

        public mipmap() {
        }
    }

drawable类型的图片 oyp 资源id为 2130837579

public static final class drawable {
        ......

        public static final int abc_textfield_search_material = 2130837578;
        public static final int notification_template_icon_bg = 2130837580;
        public static final int oyp = 2130837579;

        public drawable() {
        }
    }

String类型的资源author id为 2131099669

public static final class string {

        ......

        public static final int app_name = 2131099668;
        public static final int author = 2131099669;
        public static final int status_bar_notification_info_overflow = 2131099667;
        public static final int title = 2131099670;

        public string() {
        }
    }

可以发现打印出来的资源id和com.oyp.demo.R文件生成的资源id是一致的,因此使用getResources().getIdentifier()方法完全可以正确地获取资源的id。

2、getIdentifier()方法封装

点击查看getIdentifier()方法源代码如下所示:

/**
     * 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) {
        if (name == null) {
            throw new NullPointerException("name is null");
        }
        try {
            return Integer.parseInt(name);
        } catch (Exception e) {
            // Ignore
        }
        return mAssets.getResourceIdentifier(name, defType, defPackage);
    }

第一个参数为资源ID名,第二个为资源属性的类型,第三个为包名。

下面是一个封装好的工具栏,可以直接用来获取资源id。

package com.oyp.demo;

import android.content.Context;

/**
 * 工具类,可以通过资源名来获取资源id
 * </p><br/><br/><br/>
 * <a href = " http://blog.csdn.net/ouyang_peng "> 欧阳鹏博客</a>
 */
public class ResourceUtil {

    public static int getId(Context context, String resourceName) {
        return getIdentifierByType(context, resourceName, "id");
    }

    public static int getLayoutId(Context context, String resourceName) {
        return getIdentifierByType(context, resourceName, "layout");
    }

    public static int getStringId(Context context, String resourceName) {
        return getIdentifierByType(context, resourceName, "string");
    }

    public static int getDrawableId(Context context, String resourceName) {
        return getIdentifierByType(context, resourceName, "drawable");
    }

    public static int getMipmapId(Context context, String resourceName) {
        return getIdentifierByType(context, resourceName, "mipmap");
    }

    public static int getColorId(Context context, String resourceName) {
        return getIdentifierByType(context, resourceName, "color");
    }

    public static int getDimenId(Context context, String resourceName) {
        return getIdentifierByType(context, resourceName, "dimen");
    }

    public static int getAttrId(Context context, String resourceName) {
        return getIdentifierByType(context, resourceName, "attr");
    }

    public static int getStyleId(Context context, String resourceName) {
        return getIdentifierByType(context, resourceName, "style");
    }

    public static int getAnimId(Context context, String resourceName) {
        return getIdentifierByType(context, resourceName, "anim");
    }

    public static int getArrayId(Context context, String resourceName) {
        return getIdentifierByType(context, resourceName, "array");
    }

    public static int getIntegerId(Context context, String resourceName) {
        return getIdentifierByType(context, resourceName, "integer");
    }

    public static int getBoolId(Context context, String resourceName) {
        return getIdentifierByType(context, resourceName, "bool");
    }

    private static int getIdentifierByType(Context context, String resourceName, String defType) {
        return context.getResources().getIdentifier(resourceName,
                defType,
                context.getPackageName());
    }
}

将封装好的com.oyp.demo.ResourceUtil类应用到刚才的MainActivity中,代码如下:

package com.oyp.demo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.ImageView;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = MainActivity.class.getSimpleName();

    private ImageView mImageView;

    private ImageView mipmapImageView;

    private TextView mTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //获取布局文件资源的ID
//        int layoutId = getResources().getIdentifier("activity_main", "layout", getPackageName());
        int layoutId = ResourceUtil.getLayoutId(this, "activity_main");
        Log.d(TAG, "----> 获取到的布局文件资源 drawableId= " + layoutId);

        //获取图片资源的ID
        mImageView = (ImageView) findViewById(R.id.imageView);
//        int drawableId = getResources().getIdentifier("oyp", "drawable", getPackageName());
        int drawableId = ResourceUtil.getDrawableId(this, "oyp");
        mImageView.setImageResource(drawableId);
        Log.d(TAG, "----> 获取到的图片资源 drawableId=" + drawableId);

        mipmapImageView = (ImageView) findViewById(R.id.mipmapImageView);
//        int mipmapId = getResources().getIdentifier("ic_launcher", "mipmap", getPackageName());
        int mipmapId = ResourceUtil.getMipmapId(this, "ic_launcher");
        mipmapImageView.setImageResource(mipmapId);
        Log.d(TAG, "----> 获取到的图片资源 mipmapId=" + mipmapId);

        //获取字符串资源
        mTextView = (TextView) findViewById(R.id.textView);
//        int stringId = getResources().getIdentifier("author", "string", getPackageName());
        int stringId = ResourceUtil.getStringId(this, "author");
        mTextView.setText(stringId);
        Log.d(TAG, "----> 获取到的字符串资源 stringId=" + stringId);

        int colorId = ResourceUtil.getColorId(this , "colorPrimary");
        Log.d(TAG, "----> 获取到的颜色资源 colorId=" + colorId);

        int dimenId = ResourceUtil.getDimenId(this , "abc_dialog_min_width_major");
        Log.d(TAG, "----> 获取到的颜色资源 dimenId=" + dimenId);

        int integerId = ResourceUtil.getIntegerId(this , "abc_config_activityDefaultDur");
        Log.d(TAG, "----> 获取到的integer资源 integerId=" + integerId);

        int boolId = ResourceUtil.getBoolId(this , "abc_allow_stacked_button_bar");
        Log.d(TAG, "----> 获取到的bool资源 boolId=" + boolId);

        int attrId = ResourceUtil.getAttrId(this , "actionBarDivider");
        Log.d(TAG, "----> 获取到的attr资源 attrId=" + attrId);

    }
}

打印出来的Log日志为:

11-24 23:44:16.911 8543-8543/com.oyp.demo D/MainActivity: ----> 获取到的布局文件资源 drawableId= 2130968601
11-24 23:44:16.916 8543-8543/com.oyp.demo D/MainActivity: ----> 获取到的图片资源 drawableId=2130837579
11-24 23:44:16.918 8543-8543/com.oyp.demo D/MainActivity: ----> 获取到的图片资源 mipmapId=2130903040
11-24 23:44:16.918 8543-8543/com.oyp.demo D/MainActivity: ----> 获取到的字符串资源 stringId=2131099669
11-24 23:44:16.918 8543-8543/com.oyp.demo D/MainActivity: ----> 获取到的颜色资源 colorId=2131427347
11-24 23:44:16.918 8543-8543/com.oyp.demo D/MainActivity: ----> 获取到的颜色资源 dimenId=2131230730
11-24 23:44:16.918 8543-8543/com.oyp.demo D/MainActivity: ----> 获取到的integer资源 integerId=2131361793
11-24 23:44:16.918 8543-8543/com.oyp.demo D/MainActivity: ----> 获取到的bool资源 boolId=2131165184
11-24 23:44:16.918 8543-8543/com.oyp.demo D/MainActivity: ----> 获取到的attr资源 attrId=2130772027

作者:欧阳鹏 欢迎转载,与人分享是进步的源泉!

转载请保留原文地址:

http://blog.csdn.net/ouyang_peng/article/details/53261599

时间: 2024-10-10 09:31:02

Android使用getIdentifier()方法根据资源名来获取资源id的相关文章

Android 通过资源名,获取资源ID

有时候我们知道一个图片的文件名,我们需要知道在R文件中,该资源的ID,使用如下方法: public static int getIdByName(Context context, String className, String resName) { String packageName = context.getPackageName(); int indentify = context.getResources().getIdentifier(resName, className, pack

关于Android中根据ID名动态获取资源的两个方法

在开发中, 我们习惯了类似下面这种方式去实现引用资源: context.getResources().getDrawable(R.drawable.flower); 但是,当我们提前知道这个资源的id,想动态去引用,而不是在id里面固化应该怎么办呢? 比如某个图片资源的id是R.drawable.test_1, 而且有序的还有test_2,test_3, 我们如何动态的去引用它们?这里有两种方案:直接用反射和用resource的getIdentifier()方法,它们原理都差不多利用反射实现.

wpf 前台获取资源文件路径问题

1 <ImageBrush ImageSource="YT.CM.CommonUI;component/Resource/FloadwindowImage/middle.png"/> YT.CM.CommonUI  这是一个类库名字 Resource 这是类库下的文件夹 FloadwindowImage 是Resource下的文件夹 middle.png 是FloadwindowImage下的一张图片 若在使用上句在wpf前台获取该类库下的文件夹中的图片资源,可能会报该路径

Android根据字符串型的资源名获取对应资源id

有时候我们想动态的根据一个字符串资源名获得到对应的资源id,如根据不同的图片名称获得对应的图片,此时就应该考虑如何实现. 大家知道,在编译Android工程时,系统会自动生成一个静态资源类R,里面根据不同的资源类型有不同的静态内部类,如id,drawable等等,而每个内部类中存放的是对应的16进制的静态资源id属性,而这些属性的属性名就是资源名.常用的方法有两个: 方法一: 利用getResources().getIdentifier(String name,String defType,St

Android开发之查看应用包名package和入口activity名称的方法

使用android自动化测试工具monkeyrunner启动应用时,需要填写被测程序的包名和启动的Activity,以下有两种查看应用包名package和入口activity名称的方法: 方法一:使用aapt    //aapt是sdk自带的一个工具,在sdk\builds-tools\目录下 1.以ES文件浏览器为例,命令行中切换到aapt.exe目录执行:aapt dump badging E:\apk\es3.apk 2.运行后的结果中以下两行分别是应用包名package和入口activi

Android-使用getIdentifier()获取资源Id

使用getIdentifier()获取资源Id int i= getResources().getIdentifier("icon", "drawable", getPackageName()) ; if(i>0) {Log.i("aa","aa");} else {Log.i("vbv","aa");} 或者 int resID = getResources().getIdent

getIdentifier()获取资源

使用getIdentifier()方法可以方便的获各应用包下的指定资源ID.主要有两种方法:(1)方式一Resources resources = context.getResources();int indentify = resources.getIdentifier(org.loveandroid.androidtest:drawable/icon",null,null);if(indentify>0){icon = resources.getDrawable(indentify);

Android_使用getIdentifier()获取资源Id

Android 获取资源ID的另外一种方法,常规获取ID是在特定的文件夹下面的资源,如果在比较特殊的文件夹下面,就需要其他方法获取ID 了: 使用getIdentifier()方法可以方便的获各应用包下的指定资源ID.主要有两种方法:(1)方式一 Resources resources = context.getResources(); int indentify = resources.getIdentifier(org.loveandroid.androidtest:drawable/ico

getIdentifier()获取资源Id

工作需要使用getIdentifier()方法可以方便的获各应用包下的指定资源ID.主要有两种方法:(1)方式一Resources resources = context.getResources();int indentify = resources.getIdentifier(org.loveandroid.androidtest:drawable/icon",null,null);if(indentify>0){icon = resources.getDrawable(indenti