Android中"访问资源"解析

来源:互联网 发布:百事通软件下载 编辑:程序博客网 时间:2024/06/05 19:10

1、应用中提供Resource资源后,可通过引用其资源 ID 来应用该资源。 所有资源 ID 都在您项目的 R 类中定义,后者由 aapt 工具自动生成。
2、资源 ID 始终由以下部分组成:
    资源类型:每个资源都被分到一个“类型”组中,例如 string、drawable 和 layout。
    资源名称:它是不包括扩展名的文件名;或是 XML android:name 属性中的值,如果资源是简单值的话(例如字符串)。

在代码中访问资源

以下是在代码中引用资源的语法:[<package_name>.]R.<resource_type>.<resource_name><package_name> 是资源所在包的名称(如果引用的资源来自您自己的资源包,则不需要)。<resource_type> 是资源类型的 R 子类。<resource_name> 是不带扩展名的资源文件名,或 XML 元素中的 android:name 属性值(如果资源是简单值)。example:    R.drawable.my_background_image    R.anim.hyperspace_in    android.R.layout.simple_list_item_1

在 XML 中访问资源

以下是在 XML 资源中引用资源的语法:@[<package_name>:]<resource_type>/<resource_name><package_name> 是资源所在包的名称(如果引用的资源来自相同的包,则不需要)<resource_type> 是资源类型的 R 子类<resource_name> 是不带扩展名的资源文件名,或 XML 元素中的 android:name 属性值(如果资源是简单值)。example:    @android:color/secondary_text_dark    @color/opaque_red    @style/text_style

引用样式属性

通过“引用样式属性资源”获取在当前应用的风格主题中对应属性的值。 通过引用样式属性,可以不采用为 UI 元素提供硬编码值这种方式,而是通过为UI元素设置样式,使其自动匹配当前风格主题提供的标准变型来定制这些元素的外观。引用样式属性的实质作用是,“在当前风格主题中使用此属性定义的样式”。

要引用样式属性,名称语法几乎与普通资源格式完全相同,只不过将 at 符号 (@) 改为问号 (?),资源类型部分为可选项。 例如:

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

例如,通过以下代码引用一个属性,将文本颜色设置为与系统风格主题定义的“textColorSecondary”属性样式一致:

<EditText id="text"    android:layout_width="fill_parent"    android:layout_height="wrap_content"    android:textColor="?android:textColorSecondary"    android:text="@string/hello_world" />

在以上代码中,android:textColor 属性指定当前风格主题中某个样式属性的名称。Android 现在会使用应用于 android:textColorSecondary 样式属性的值作为 android:textColor 在这个小部件中的值。由于系统资源工具知道此环境中肯定存在某个属性资源,因此您无需显式声明类型(类型应为 ?android:attr/textColorSecondary)— 您可以将 attr 类型排除在外。
在看一下代码:

<Toolbar      android:layout_height="?android:attr/actionBarSize"     android:layout_width="match_parent"    android:background="?android:attr/colorPrimaryDark"   android:theme="@android:style/ThemeOverlay.Material.Dark.ActionBar" /> 

说明以下3种访问方式的区别
?attr/actionBarSize:访问当前主题的属性。

?android:attr/actionBarSize:访问在系统样式主题中定义的样式属性。

@android:color/black:访问系统资源中的内容,属于硬编码。


样式和主题

1、样式是指为 View 或窗口指定外观和格式的属性集合。样式可以指定高度、填充、字体颜色、字号、背景色等许多属性。 样式是在与指定布局的 XML 不同的 XML 资源中进行定义。

2、主题是指对整个 Activity 或应用而不是对单个 View(如上例所示)应用的样式。 以主题形式应用样式时,Activity 或应用中的每个视图都将应用其支持的每个样式属性。 例如,您可以 Activity 主题形式应用同一 CodeFont 样式,之后该 Activity 内的所有文本都将具有绿色固定宽度字体。

1. 定义样式

  • <style>样式,parent 属性是可选属性,它指定应作为此样式所继承属性来源的另一样式的资源 ID。 如果愿意,可在随后替换这些继承的样式属性
<?xml version="1.0" encoding="utf-8"?><resources>    <style name="CodeFont" parent="@android:style/TextAppearance.Medium">        <item name="android:layout_width">fill_parent</item>        <item name="android:layout_height">wrap_content</item>        <item name="android:textColor">#00FF00</item>        <item name="android:typeface">monospace</item>    </style></resources>
  • 如果您想从自行定义的样式继承属性,则不必使用 parent 属性, 而是只需将您想继承的样式的名称以前缀形式添加到新样式的名称之中,并以句点进行分隔。 例如,要创建一个继承上文定义的 CodeFont 样式的新样式,但将颜色设置为红色,您可以按如下方式创建这个新样式:
<style name="CodeFont.Red">        <item name="android:textColor">#FF0000</item></style>

请注意,<style> 标记中没有 parent 属性,但由于 name 属性以 CodeFont 样式名称(这是您创建的一个样式)开头,因此这个样式会继承该样式的所有样式属性。 这个样式随后会替换 android:textColor 属性,将文本设置为红色。 您可以 @style/CodeFont.Red 形式引用这个新样式。

您可以通过使用句点链接名称继续进行这样的继承,次数不限。 例如,您可以通过以下代码将 CodeFont.Red 扩大:

<style name="CodeFont.Red.Big">     <item name="android:textSize">30sp</item></style>

这段代码同时从 CodeFont 和 CodeFont.Red 样式继承,然后添加 android:textSize 属性。

注:这种通过将名称链接起来的继承方法只适用于由您自己的资源定义的样式。 您无法通过这种方法继承 Android 内建样式。 要引用内建样式(例如 TextAppearance),您必须使用 parent 属性。

  • 样式属性
    View引用属性时,需要了解什么类型的样式属性(由 元素定义)可以使用。
PS:应用样式的 View 不支持所有样式属性,该 View 将只应用那些受支持的属性,并直接忽略其他属性

某些样式属性任何 View 元素都不提供支持,只能以主题形式应用. 这些样式属性应用于整个窗口而非任何类型的 View
例如:主题的样式属性可以隐藏应用标题、隐藏状态栏或更改窗口的背景,以 window 开头的属性的内容:windowNoTitle 和 windowBackground等。查看所有可用样式属性的参考资料R.attr

2.APP引用样式和主题

设置样式的方法有两种:

  • 对单个视图应用样式,请为布局 XML 中的 View 元素添加 style 属性。
  • 对整个 Activity 或App应用样式,请为 Android 清单中的 <activity> 或 <application> 元素添加 android:theme 属性。

单个视图(View/ViewGroup等)只有被直接引用样式的视图才会应用其属性,子元素是不会继承这些属性的。

引用示例:

<application android:theme="@style/CustomTheme"><activity android:theme="@android:style/Theme.Dialog"><activity android:theme="@android:style/Theme.Translucent">

3.根据不同的运行版本切换兼容主题

新版本的 Android 可为应用提供更多主题,在这些平台上运行时可以使用这些新增主题,同时仍可兼容旧版本。 可以通过自定义主题来实现这一目的,该主题根据平台版本利用资源选择在不同父主题之间切换。

例如,以下这个声明所对应的自定义主题就是标准的平台默认明亮主题。 它位于 res/values 之下的一个 XML 文件(通常是 res/values/styles.xml)中:

<style name="LightThemeSelector" parent="android:Theme.Light">    ...</style>

为了让该主题在应用运行在 Android 3.0(API 级别 11)或更高版本系统上时使用更新的主题,您可以在 res/values-v11 下的 XML 文件中加入一个替代主题声明,但将父主题设置为全息主题:

<style name="LightThemeSelector" parent="android:Theme.Holo.Light">    ...</style>

App使用LightThemeSelector主题时,其运行于 Android 3.0 或更高版本的系统上时自动切换到全息主题。


官方提供可使用style、theme属性说明文档:

R.styleable.Theme 提供了可在主题中使用的标准属性的列表

R.style 类中找到所有可用样式的参考资料
要使用此处所列样式,请将样式名称中的所有下划线替换为句点。 例如,您可以使用 “@android:style/Theme.NoTitleBar” 应用 Theme_NoTitleBar 主题。

Android 样式和主题,请参阅以下源代码:

  • Android 样式 (styles.xml)

  • Android 主题 (themes.xml)

查看所有可用样式属性的参考资料,请参阅 R.attr

0 0
原创粉丝点击