资源与R文件

资源是被你APP代码使用额外的文件(非代码文件)。Android支持一些不同各类的资源文件,他们分别存放在res目录下,不同的资源对应不同的子目录,如下表所示:

默认目录

说明

animator

用于定义属性动画的 XML 文件。

anim

定义补间动画的 XML 文件。(属性动画也可以保存在此目录中,但是为了区分这两种类型,属性动画首选 animator/ 目录。)

color

用于定义颜色状态列表的 XML 文件。

drawable

位图文件(.png、.9.png、.jpg、.gif)或编译为以下可绘制对象资源子类型的 XML 文件:

  1. 位图文件
  2. 九宫格(可调整大小的位图)
  3. 状态列表
  4. 形状
  5. 动画可绘制对象
  6. 其他可绘制对象

mipmap

适用于不同启动器图标密度的可绘制对象文件

layout

用于定义用户界面布局的 XML 文件

menu

用于定义应用菜单(如选项菜单、上下文菜单或子菜单)的 XML 文件

raw

要以原始形式保存的任意文件,可以通过Resources.openRawResource(),返回InputStream访问资源文件

values

包含字符串、整型数和颜色等简单值的 XML 文件。

其他 res/ 子目录中的 XML 资源文件是根据 XML 文件名定义单个资源,而 values/ 目录中的文件可描述多个资源。可以根据自己的需要命名文件,并将不同的资源类型放在一个文件中。但是,为了清晰起见,建议将独特的资源类型放在不同的文件中。 例如,可以按照如下的命名约定在此目录中创建的资源:

  1. arrays.xml,用于资源数组(类型化数组)。
  2. colors.xml:颜色值。
  3. dimens.xml:尺寸值。
  4. strings.xml:字符串值。
  5. styles.xml:样式。

xml

可以在运行时通过调用 Resources.getXML() 读取的任意 XML 文件。

       应该始终使用应用资源,例如图像和代码中的字符串,这样不但有利于单独维护这些资源。 而且还可以为特定设备提供特定的备用资源,这样在运行时,Android 会根据当前配置使用适当的资源。例如,可需要根据屏幕尺寸提供不同的 UI 布局,或者根据语言设置提供不同的字符串。几乎每个应用都应提供备用资源以支持特定的设备配置,Android通过限定符提供不同的备用资源,例如:

drawable-port-hdpi/

       表示适用于纵向高密度屏幕的图像资源。

编译Android APP时,会对res下的资源文件进行编译,并为不同的资源生成一个对应R类的内部类,如下图所示:

在资源类型对应的内部类中,每一个资源项根据其名称都会有对应一个整型的Id值,通过该Id值可以完成对资源的访问(资源的名称可能是无后缀的文件名,也可能是XML文件中有android:name属性指定的名称);

下面给出资源访问的两种方式:

  1. 在Java代码中访问资源

在Java代码中可以直接通过R类访问资源的Id,例如

setContentView(R.layout.main_layout);

       直接访问main_layout资源的Id。

       如果需要获取实际的资源,可以通过Resources类完成。Context对象(Activity、Service等都从Context继承)提供了getResources()方法来获取Resources对象,Resources对象提供了getXXX方法来获取资源,例如下面代码能够获取字符串资源的实际值

String appTitle = getResources().getString(R.string.app_name);

Log.d(this.getClass().getName(), appTitle);

       此外,LayoutInflater也可以加载布局文件。

  1. 在XML文件中访问资源

在XML文件中访问资源相对比较简单,语法格式如下所示:

@[<package_name>:]<resource_type>/<resource_name>

       <package_name>:值定资源所在的包,如果引用的资源位于同一个包下,则可以省略;

       <resource_type>:R类中代表不同资源类型的子类;

       <resource_name>:指定资源的名称

       后期课程还会讲解Android的资源,下面下通过字符串、颜色、数组三种简单的资源学习Android资源的使用。

       字符串

       字符串资源主要存放在values目录下的strings.xml文件中,以resources作为根元素,如下图所示:

       开发人员可以通过Id访问字符串资源,也可以通过Resources类的getString获取字符串值,此外Resources类还提供了getText方法,可以获取字符串值,该方法返回的是一个CharSequence接口。String,CharSequence以及StringBuilder,StringBuffer之间的关系如下图所示:

       Android还可以定义Boolean类型的资源(在bools.xml文件中)和Integer类型的资源(在integers.xml文件中),使用方法与String类似,大家可以自行学习练习;

       颜色

Android颜色定义在colors.xml文件中,,以resources作为根元素,如下图所示:

Android支持四种颜色的形式

#RGB:分别指定红、绿、蓝三原色的值(支持0-f 16级颜色)

#ARGB:分别指定透明度以及红、绿、蓝三原色(支持0-f 16级透明度和颜色)

#RRGGBB:分别指定红、绿、蓝三原色的值(支持00-ff 256级颜色)

#AARRGGBB:分别指定透明度以及红、绿、蓝三原色(支持00-ff 256级透明度和颜色)

       可以通过Id访问颜色资源,也可以调用Resource的getColor方法获取颜色值,注意:从API 23开始,该方法需要传递一个Resource. Theme对象,可以通过Context的getTheme方法获取当前的Theme对象,如下所示:

resource.getColor(R.color.color1, this.getTheme());

       数组

       数组资源在arrays.xml中定义,,以resources作为根元素,可以定义三种数组资源:

       <array>…</array>:定义普通的数组资源

       <string-array>…</string-array>:定义字符串数组资源

       <integer-array>…</integer-array>:定义整形数组资源

如下图所示:

在Java代码中,可以通过Resources类的如下方法访问数组

getStringArray:获取字符串数组

getIntArray:获取整形数组

obainTypedArray:获取普通数组,该方法返回一个TypedArray对象,代表通用类型的数组,该对象提供了getXXX方法,获取指定索引处的数组值,关于TypedArray的详细可以参考:

https://developer.android.google.cn/reference/android/content/res/TypedArray

(张伟:2018年9月6日)

(转载时请注明来源)

 

猜你喜欢

转载自blog.csdn.net/salary/article/details/82459566