[译]:Xamarin.Android应用基础——Android资源基础
博客分类: 官方教程
返回索引目录
原文链接:Android Resource Basics
译文链接:Xamarin.Android应用基础——Android资源基础
Part 1 - Android资源基础
几乎所有Android应用都多少有些资源,至少他们通常会有xml文件格式的用户界面布局文件。当Xamarin.Android应用首次创建时,Xamarin.Android项目模板会添加一些默认资源:
Resource文件夹中的默认资源主要有以下五个文件:
- Icon.png - 应用的默认图标
- Main.axml - 应用的默认用户界面布局文件。注意:Android中使用.xml文件后缀,在Xamarin.Android中使用.axml文件后缀。
- String.xml - 应用的字符串对应关系表,可以辅助实现本地化。
- Resource.designer.cs - 本文件由Xamarin.Android自动生成与维护,并且其中为每个资源分配了唯一的ID标识。这与使用Java编写Android应用时,所用的R.java文件非常相似。它由Xamarin.Android工具自动创建,并会不时地重新生成。
- AboutResources.txt - 本文件不是必需的,可以安全删除。它仅仅提供针对资源及其内的文件进行高级概述。
资源的创建与访问
创建资源就像向相关资源类型目录中添加文件一样简单。下面截图中展示了为项目添加字符串资源来支持德语环境。当添加了String.xml后,Xamarin.Android 工具会自动执行构建操作来设置Android资源:
这样,可以允许Xamarin.Android工具正确的编译并将资源文件嵌入到APK文件中。如果由于某些原因,构建操作没有将文件设置到 Android Resource,那样文件会被排除在APK之外,这样,任何尝试加载或访问资源的操作都将导致运行时错误,并导致应用崩溃。
另外,要注意的重点是,尽管Android只支持资源项小写文件名,但是Xamarin.Android略有点宽容,它将支持同时支持大写和小写的文件名。图片文件名称的常规命名方式是小写字母,并使用下划线分割(例如,my_image_name.png)。注意,以短横线或空格分割来命名的资源文件将不会被处理。
一旦资源被添加到项目中,应用可以有两种方式使用它们:在代码中编程使用或在XML文件中使用。
以编程方式引用资源
为了以编程方式访问文件,它们被分配了唯一的资源ID。资源ID是在特殊类Resource
中定义的整型数字 —— 可以在Resource.designer.cs文件中找到,内容类似如下代码:
public partial class Resource
{
public partial class Attribute
{
}
public partial class Drawable {
public const int Icon=0x7f020000;
}
public partial class Id
{
public const int Textview=0x7f050000;
}
public partial class Layout
{
public const int Main=0x7f030000;
}
public partial class String
{
public const int App_Name=0x7f040001;
public const int Hello=0x7f040000;
}
}
每一个资源ID都是包含在与其相对应的资源类型的嵌套类里面。例如,当文件icon.png被添加到项目中时,Xamarin.Android会更新Resource
类,它会创建一个嵌套类Drawable
,并在其内部添加Icon
字段。此时,文件Icon.png可以通过代码Resource.Drawable.Icon
来进行引用。Resource
类不应该手动修改,因为任何修改都会被Xamarin.Android重写。
当在代码中使用编程方式引用资源时,可以使用如下层级结构代码语法进行访问:
@[<PackageName>.]Resource.<ResourceType>.<ResourceName>
- PackageName - 提供资源的包,只有在使用来自其他包的资源时才需要。
- ResourceType - 如上所述 ,它是一个Resource类的内嵌资源类型。
- Resource Name - 资源文件的名称(不含后缀名)或者是在XML元素中为资源设置的android:name属性的值。
在XML中使用资源
在XML文件中访问资源时,使用如下特殊语法:
@[<PackageName>:]<ResourceType>/<ResourceName>.
- PackageName - 只有在使用来自其他包的资源时才需要。
- ResourceType - Resource类中的嵌套资源类型。
- Resource Name - 资源文件的名称(不含后缀名)或者是在XML元素中为资源设置的android:name属性的值。
例如在布局文件Main.axml中可以如下使用:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ImageView android:id="@+id/myImage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/flag" />
</LinearLayout>
本示例中有一个ImageView控件,其使用了drawable资源中的名为flag的资源。ImageView为其src
属性设置了@drawable/flag。当activity启动后,Android会在Resource/Drawable目录中查找名为flag.png的文件(文件后缀可以是其他图片格式,如flag.jpg),然后会加载文件并将其显示到ImageView
中。当应用运行后,界面情况如下图所示:
译:奇葩史