本文概述
在这里, 我们将说明开发人员在开发Android应用程序时需要注意的一些任务或概念。
辅助功能
在这里, 我们将讨论如何使用Android Accessibility API来构建应用程序。
UI元素
Android提供了ContentDescription属性, 屏幕阅读API会使用该属性来描述控件可访问性的目的。
内容的描述在AXML布局文件中。
AXML布局
在XML布局中, 我们使用android:contentDescription属性:
<ImageButton
android:id=@+id/saveButton"
android:src="@drawable/save_image"
android:contentDescription="Save data" />
提示TextView
对于数据输入, EditText和TextView控件使用Hint属性提供所需输入的描述。输入文本后, 文本本身将”读取”而不是提示。
AXML布局
XML布局文件使用android:hint属性:
<EditText
android:id="@+id/someText"
android:hint="Enter some text" />
LabelFor链接带有标签的输入字段
要将标签与数据输入控件相关联, 我们使用labelFor属性。
AXML布局
在XML布局中, 我们使用android:labelFor属性引用另一个控件的标识符:
<TextView
android:id="@+id/labelFirstName"
android:hint="Enter some text"
android:labelFor="@+id/editFirstName" />
<EditText
android:id="@+id/edit first name"
android:hint="Enter some text" />
宣布辅助功能
启用辅助功能后, 我们将在任何视图控件上使用AnnounceForAccessibility方法将事件或状态更改传达给用户。内置旁白提供足够反馈的所有操作都不需要AnnounceForAccessibility。我们可以使用AnnounceForAccessibility, 其中的其他信息将对用户有所帮助。
下面的代码显示了一个简单的示例, 调用AnnounceForAccessibility:
button.Click += delegate {
button.Text = string.Format ("{0} clicks!", count++);
button.AnnounceForAccessibility (button.Text);
};
更改焦点设置
导航取决于控件, 这些控件侧重于用户对操作可用性的理解。 Android提供了Focusable属性, 可以使标签控件专门在导航期间接收焦点。
AXML布局
在布局XML文件中, 设置Android:focusable属性:
<android:focusable="false" />
我们可以使用在XAML布局中设置的nextFocusDown, nextFocusLeft, nextFocusup属性关注控件的顺序。我们使用这些属性来确保用户可以轻松浏览屏幕上的控件。
Android资源
在这里, 我们将展示Xamarin中Android资源的概念。
Android应用程序只是源代码。许多文件可以构成应用程序, 例如视频, 图像, 字体和音频文件。非源代码文件称为资源, 在构建过程中进行编译, 并打包为APK以分发和安装到设备中:
资源为Android应用程序提供了不同的优势:
- 代码分离:资源将源代码与图像, 字符串, 菜单, 动画, 颜色等分开。资源还有助于本地化。
- 针对多个设备:资源无需更改代码即可支持不同的设备。
- 编译时检查:在应用程序中, 资源是静态的, 并已编译到应用程序中。在编译时, 这可以验证资源。那时, 很容易发现并纠正错误。在运行时, 更难发现错误, 并且纠正错误的成本很高。
启动新的Xamarin.Android项目时, 将创建一个专有目录Resources, 以及一些子目录:
该屏幕快照显示了应用程序资源根据其类型排列在子目录中。可绘制目录具有图像;视图进入布局子目录, 等等。
这里是在Xamarin中访问资源的两种方法。 Android应用程序:使用XML语法以编程方式以代码形式并以XML声明方式。
这些资源称为默认资源, 除非找到更具体的匹配项, 否则所有设备都将使用它们。每种类型的资源都可以具有Android可以用来定位特定工具的备用资源。
例如, 提供了以用户的区域设置和屏幕大小为目标的资源。如果设备从纵向旋转到横向旋转90度, 则在所有情况下, Android都会为应用程序加载资源, 而无需进行任何额外的编码工作。
在目录的末尾, 通过添加短字符串来指定包含其他资源的目录, 这称为限定符。
例如, resource / drawable-de将为设置为德语语言环境的设备指定图像, 而resource / drawable-fr将为设置为法语区域的设备指定图像。下图显示了提供其他资源的示例, 在该图像中, 通过更改设备的区域设置运行同一应用程序:
在这里, 我们将讨论与资源相关的更多基本术语。这些是:
Android资源基础
几乎所有的Android应用程序都有一些参考资料。应用程序通常具有XML文件形式的用户界面布局。当我们首先创建Xamarin.Android应用程序时, Xamarin.Android项目模板会设置默认资源。
如屏幕截图所示, 这是在资源文件夹中创建默认资源的五个文件:
- Icon.png-这是应用程序的默认图标
- Main.axml-Main.axml是应用程序的默认用户界面布局文件。 Android使用.xml文件扩展名, 而Xamarin.Android使用.axml文件扩展名。
- Strings.xml-字符串表有助于应用程序本地化。
- AboutResources.txt-该文件对于应用程序不是必需的, 可以安全地删除。它仅提供”资源”文件夹概述以及其中的文件。
- 资源设计师。 Cs-该文件由Xamarin.Android自动生成并维护, 该文件包含唯一ID, 并且该ID已分配给每个资源。资源设计师。 Cs与R.java文件非常相似且相同。 Xamarin自动创建它。 Android工具将不时重新生成。
创建和访问资源
创建资源就像将文件添加到资源目录一样简单。将Strings.xml添加到文件后, Xamarin.Android工具会自动将Build Action设置为AndroidResources:
这允许Xamarin。 Android工具可以正确编译并将资源嵌入APK文件。如果出于某种原因, “构建操作”未设置为” Android资源”, 则数据将从APK中排除。在加载或访问时, 资源会给出运行时错误, 并且应用程序崩溃。
Xamarin时, Android仅支持资源项的小写文件名。 Android同时支持大写和小写。图像名称的约定是使用带下划线的小写字母作为分隔符, 例如my_image_name.png。如果将破折号或空格用作分隔符, 则无法处理资源的名称。
以编程方式引用资源
要以编程方式访问所有资源文件, 必须为数据分配唯一资源ID。资源ID是在称为Resources的特定类中定义的整数, 可在文件Resource.Designer.CS中找到该ID。
代码看起来像这样:
public partial class Resource
{
public partial class Attribute
{
}
public partial class Drawable {
public constint 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;
}
每个ResourceID都在嵌套类内找到, 它对应于Resources的类型。
将icon.png文件添加到项目中后, Xamarin.Android更新了Resource类, 并创建了一个名为Drawable的嵌套类, 并带有一个常量名称图标。 Drawable允许文件icon.png在代码中称为Resource.Drawable.Icon。
资源类别不应手动编辑; Xamarin将覆盖Android中的所有更改。
当我们以编程方式引用资源时, 可以通过资源类层次结构来访问它们。在这里, 我们使用以下语法:
[<PackageName>.]Resource.<ResourceType>.<ResourceName>
PackageName:软件包, 它提供了Resource, 该资源要求使用该资源的另一个软件包中的资源。
资源类型:这是资源类中嵌套资源的类型。
资源名称:这是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, 它需要可绘制资源名称标志。 ImageView具有一个src属性, 该属性设置为@ drawable / flag。活动开始时, Android将在Resource / Drawable目录中查找文件flag.png(文件扩展名可以是另一种图像格式, 例如flag.jpg), 然后加载该文件并将其显示在ImageView中。当该应用程序运行时, 它将类似于下图:
默认资源
默认资源是不是特定于任何特定设备的项目。如果未找到特定资源, 则它是Android OS的默认选择。默认资源是最常见的资源。根据资源的类型, 它们被安排在Resource目录的子目录中。
在上图中, 它显示了可绘制资源, 布局和值的默认值(XML文件, 其中包含简单值)。
资源类型的列表是:
- 可绘制:可绘制资源是图形的一般概念。 Drawable资源可以编译到应用程序中, 并可以通过API调用进行访问, 也可以被其他XML资源引用。可绘制图像的示例包括:位图文件(.png, .gif, .jpg), 可调整大小的特殊位图(称为”九修补程序”), 以XML定义的通用形状等。
- 布局:在布局中, XML文件描述了用户界面的布局, 例如活动或列表中的行。
- 动画器:描述动画属性的XML文件, 它引入了API 11(Android 3.0)并提供了动画对象的属性。属性动画是描述任何对象的动画的更灵活, 更强大的方法。
- 动画:XML文件描述补间动画。补间动画是关于视图对象内容的一系列动画指令, 例如, 图像的旋转和文本大小的增长。补间动画仅限于查看对象。
- color:XML文件描述颜色列表。为了了解颜色列表, 我们考虑一个UI小部件, 例如Button。颜色可能具有不同的状态, 例如按下或禁用, 并且按钮可能会随着状态的每次更改而改变颜色。该列表显示在状态列表中。
- 菜单:描述应用程序菜单的XML文件, 例如选项菜单, 上下文菜单和子菜单。菜单的示例是弹出菜单, 标准控制菜单。
- raw:以原始和二进制格式保存的任意文件。这些文件在Android应用程序中以二进制格式编译。
- 值:包含简单金额的XML文件。在XML文件值中, 目录未定义单个资源, 而是可以标识多个资源。例如, 一个XML文件包含一个字符串值列表, 并且XML文件可能包含颜色值。
- xml:XML文件的功能类似于.Net配置文件。这些是应用程序可以在运行时读取的任意XML。
备用资源
备用资源是针对特定设备的那些资源。备用资源也定义为运行时配置, 例如当前语言, 屏幕大小和像素密度。如果android可以匹配特定于特定设备或配置的资源而不是默认资源, 则在这种情况下, 我们将使用备用资源。如果Android找不到与当前配置匹配的其他资源, 则我们将加载默认资源。备用资源子目录的名称为Resource-type-qualifier。
限定符是用于标识特定设备配置的名称。一个名称可以包含多个限定符。破折号将它们分开。
从上面的屏幕截图中可以看出, 它包含用于各种配置的其他资源, 例如语言环境, 屏幕大小, 屏幕密度和方向。
在将限定词添加到资源时适用以下规则:
- 可能有多个限定符和一个分隔符的破折号。
- 限定词只能指定一次。
- 限定词在表中显示时必须顺序排列。
资格赛名单如下:
- MCC和MNC:完整的MCC移动国家/地区代码, MNC是移动网络代码。 Sim卡将提供MCC, 而网络设备将提供MNC。可以使用”移动国家/地区代码”作为目标区域, 建议的方法是使用”语言限定符”。例如:集中德国资源;限定词为mcc262。在美国的T-mobile目标资源中, 可用的限定词是mcc310-mnc206。
- 语言:两个字母的ISO 639-1语言代码, 然后是两个字母的ISO-3166-alpha-2地区代码。如果同时显示了两个限定符, 则它们之间用-r分隔。例如, 要定位法语地区, 则使用限定符fr。要定位法属加拿大地区, 将使用fr-rCA。
- 最小宽度:要执行该应用程序, 我们必须指定屏幕的最小宽度。提供API级别13或更高版本(Android 3.2)。
例如, 限定符sw320 dp用于定位高度和宽度至少为320 dp的设备。 - 屏幕纵横比-屏幕纵横比基于纵横比, 而不是屏幕方向。大屏幕更全面。我已在API级别4(Android 1.6)中添加了内容。可能的值很长。
- 屏幕方向-这包括纵向或横向屏幕方向。屏幕方向可能会在应用程序的生命周期内发生变化。可能的值为港口和陆地。
- 坞站模式-汽车中的设备是坞站或台式坞站。在API级别8(Android 2.2.x)中添加了Dock模式。停靠模式中可能的值是汽车和办公桌。
- 夜间模式-应用程序在晚上还是白天运行。夜间模式可能会在应用程序的生命周期内发生变化, 并且旨在允许开发人员在夜间使用接口的较暗版本, 并在API级别8(Android 2.2.x)中进行了添加。夜间模式下的可能值为夜晚而非夜晚。
- 屏幕像素密度(dpi)-屏幕像素密度显示物理屏幕上给定区域中的像素数。通常表示为每英寸点数(dpi)。可能的值为:
- ldpi-低密度屏幕。
- mdpi-中密度屏幕
- hdpi-高密度屏幕
- xhdpi-超高密度显示器
- nodpi-未缩放的资源
- tvdpi-这包括API(Android 3.2)级别13中介于mdpi和hdpi之间的屏幕。
- 触摸屏-定义设备可能具有的触摸屏类型。可能的值为触控笔(适用于触控笔的电阻式触摸屏), 手指(触摸屏)和notouch(无触摸屏)。
- 键盘可用性-定义可用的键盘类型。键盘可用性可能会在应用程序的生命周期内发生变化-例如, 当用户打开键盘时。值是:
- keysexposed-keysexposed限定符定义为设备具有硬件键盘的时间。如果没有启用任何软件键盘, 则在打开硬件键盘时, 将使用keyexposed。
- keyshidden-当设备具有键盘硬件但不可见且未启用键盘软件时, 将使用keyshidden限定符。
- keyssoft-当设备启用了键盘软件时, 将使用keyssoft限定符。
- 主文本输入法-此限定符用于指定可用于输入的硬件键的类型。可能的值为:
- nokeys-没有用于输入的硬件键。
- qwerty-有一个可用的qwerty键盘。
- 12键-有12键硬件键盘
- 导航键可用性-对于5向或d-pad(方向键), 可以使用导航。导航键可用性在应用程序的生存期内可能会发生变化。可能的值为:
- 并列放置-导航键可供用户使用
- navhidden-它不包含导航键。
- 主要的非触摸式导航方法-设备上提供了这种类型的导航。可能的值为:
- nonav-唯一可用的导航工具是触摸屏
- d-pad-d-pad(方向盘)可用于导航
- 跟踪球-设备具有用于导航的跟踪球
- wheel-罕见的情况, 有一个或多个方向盘可用
- 平台版本(API级别)-设备支持vN格式的平台版本, 其中N是目标API。例如, v11以API级别11设备为目标。
Android确定要使用的资源
android应用程序包含许多资源。在这里, 我们将研究Android在设备上运行时如何为应用选择资源。
Android通过遍历Test的规则来显示参考资料的基础:
- 消除矛盾的限定词-例如, 如果定向设备是人像, 则将消除风景资源目录。
- 不支持忽略限定符-所有限定符并非对所有API级别都可用。如果资源目录包含设备不支持的限定符, 那么将避免使用该资源目录。
- 确定下一个最高优先级的限定词-根据上表, 选择下一个最高优先级的限定词(从上到下)。
- 保留任何用于限定符的资源目录-如果任何资源目录都与上述限定符匹配, 请选择下一个优先级最高的限定符(从上到下)。
当系统正在寻找资源而找不到资源时, 它将寻找其他资源并对其进行扩展。 Android无法找到默认资源。例如, 当Android正在寻找低密度资源且该资源不可用时, Android可能会在默认或中等密度资源上选择高密度资源的版本。这样做的原因是, 高密度资源的测量因子为0.5, 与中等密度资源的测量因子为0.75相比, 这将导致一些可见性问题。
例如:考虑一个具有以下可绘制资源目录的应用程序:
drawable
drawable-en
drawable-fr-rCA
drawable-en-port
drawable-en-notouch-12key
drawable-en-port-ldpi
drawable-port-ldpi
drawable-port-notouch-12key
然后, 应用程序将在具有以下配置的设备上运行:
• Locale - en-GB
• Orientation - port
• Screen density - hdpi
• Touchscreen type - notouch
• Primary input method - 12key
消除了法国资源与en-GB语言环境的冲突:
drawable
drawable-en
drawable-en-port
drawable-en-notouch-12key
drawable-en-port-ldpi
drawable-port-ldpi
drawable-port-notouch-12key
从限定符表MCC和MNC中选择第一个限定符。没有包含该限定符的资源目录, 因此MCC / MNC代码将被忽略。
下一个限定词选择语言。一些资源与语言代码匹配。拒绝所有与语言代码不匹配的资源目录, 现在列出资源列表:
drawable-en-port
drawable-en-notouch-12key
drawable-en-port-ldpi
屏幕方向的下一个限定符是消除了与屏幕方向端口不匹配的资源目录:
drawable-en-port
drawable-en-port-ldpi
屏幕密度的限定符为ldpi, 从而排除了另一个资源目录:
drawable-en-port-ldpi
因此, Android将使用设备资源目录drawable-en-port-ldpi中的drawable资源。