Android API Guides---Making Applications Accessible

Making Applications Accessible

为Android构建的应用程序都与当这些用户激活设备上的无障碍服务和功能视力,肢体或与年龄相关的限制用户更容易获得。这些服务使应用程序更容易,即使你不做任何辅助功能更改你的代码。不过,也有你应该优化应用程序的可访问性,并确保为所有用户一个愉快的经历的步骤。
确保你的应用是所有用户都可以访问只需要几步,特别是当你创建了Android框架提供的组件的用户界面。如果你只使用标准组件为您的应用程序,步骤如下:
contentDescription属性:使用了android添加描述性文本用户界面控件在应用程序中。要特别注意的ImageButton,ImageView的和CheckBox。
确保可以接受输入(触摸或打字)所有用户界面元素可以用定向控制器达到,如轨迹球,D垫(物理或虚拟)或导航手势。
确保语音提示总是伴随着另一种视觉提示或通知,协助谁是失聪或有听力障碍的用户。
只用辅助导航服务和功能测试应用程序。打开话语提示和触摸浏览,然后再尝试使用你的应用程序只使用定向控制。有关测试的可访问性的更多信息,请参阅辅助功能测试清单。
如果你建立了扩展视图类自定义控件,你必须完成一些额外的工作,以确保您的组件都可以访问。本文讨论了如何自定义视图控件与无障碍服务兼容。
注:本文中的实施步骤描述制作与失明或低视力的用户您的应用程序访问的要求。一定要检讨谁是又聋又重听在辅助功能开发清单服务的用户的要求

标签用户界面元素
许多用户界面控件依赖于视觉提示来指示它们的含义和用法。例如,笔记应用程序可能使用的ImageButton带加号的照片,以表明用户可以添加一个新的注释。一个EditText组件可能接近它的标签,表明其目的。视力受损的用户看不到这些线索不够好,跟着他们,这让他们也没用。
您可以通过这些控件与Android更容易:contentDescription XML布局属性。在该属性的文本不会出现在屏幕上,但如果用户启用无障碍服务提供声音提示,那么当用户导航到该控件,文字转换成语音。
为此,设置了android:contentDescription属性为每一位的ImageButton,ImageView的,复选框在应用程序的用户界面,并添加描述那些可能需要谁不能够看到它的用户附加信息任何其他输入控件。
例如,下面的ImageButton设置的加号按钮向add_note字符串资源,这可以被定义为“添加记事”为英文界面内容说明

<ImageButton
    android:id=”@+id/add_note_button”
    android:src=”@drawable/add_note”
    android:contentDescription=”@string/add_note”/>
通过包括描述,无障碍服务,提供语音反馈可以宣布“添加记事”当用户将焦点移动到该按钮或悬停。


注:对于的EditText领域,提供了一个机器人:提示属性而不是内容描述,帮助用户了解什么时候该文本字段为空内容的预期。当字段被填满,话语提示读取代替提示文本输入的内容给用户。


启用焦点导航


焦点导航让用户残疾人使用定向控制器通过用户界面控件步骤。定向控制器可以是物理的,如轨迹球,方向垫(D-板)或箭头键,或虚拟的,诸如眼睛免费键盘,或在Android 4.1及更高的可用手势导航模式。定向控制器是众多Android用户导航的主要手段。


为了确保用户可以只使用一个方向控制器导航应用程序,请验证您的应用程序的所有用户界面(UI)输入控制可以达到和不使用触摸屏激活。你也应该确认具有方向性控制器的中央按钮(或OK按钮)点击有作为触摸已经有一个集中控制的效果相同。有关测试定向控制的信息,请参阅测试焦点导航。


启用视图焦点


用户界面元素可达使用定向控制时,其Android:聚焦的属性被设置为true。此设置允许用户使用方向控制聚焦元素上,然后用它进行交互。通过Android框架提供的用户界面控件默认可聚焦和视觉改变控件的外观指示焦点。


Android提供多种API,让你控制用户界面的控制是否可获得焦点,甚至要求控制给予重点:


setFocusable()
isFocusable()
requestFocus()方法
聚焦的属性设置为true或调用其setFocusable()方法:如果视图不可作为焦点,在默认情况下,您可以通过Android的设置让它在你的布局文件可成为焦点。


控制焦点秩序


当用户使用定向控制在任何方向上导航时,焦点从一个用户接口元件(视图)到另一个传递,如通过聚焦顺序确定。这个顺序是基于发现在给定方向的近邻的算法。在罕见的情况下,该算法可能不匹配,你意或可以不合乎逻辑的用户的次序。在这些情况下,您可以使用在布局文件中的以下XML属性提供明确的替代来排序:


android:nextFocusDown
定义下一个视图当用户导航到接收焦点。
android:nextFocusLeft
定义下一个视图当用户导航离开接收焦点。
android:nextFocusRight
定义下一个视图当用户导航有权获得焦点。
android:nextFocusUp
定义下一个视图当用户导航到接收焦点。
以下示例XML布局显示了Android的2聚焦的用户界面元素:nextFocusDown和android:nextFocusUp属性被显式设置。 TextView的座落于EditText上的权利。然而,由于这些性质已经确定,该TextView元素现在可以通过按下箭头当焦点是的EditText元素上达到

<LinearLayout android:orientation="horizontal"
        ... >
    <EditText android:id="@+id/edit"
        android:nextFocusDown=”@+id/text”
        ... />
    <TextView android:id="@+id/text"
        android:focusable=”true”
        android:text="Hello, I am a focusable TextView"
        android:nextFocusUp=”@id/edit”
        ... />
</LinearLayout>
当修改的焦点秩序,确保导航将按预期从每个用户界面控制所有的方向和反向航行时(要回你原来的地方)。
注意:您可以在运行时修改用户界面组件的焦点顺序,使用诸如setNextFocusDownId()和setNextFocusDownId()。
建立残疾人自定义视图
如果应用程序需要自定义视图组件,你必须做一些额外的工作,以确保您的自定义视图访问。这些都为确保您的视图的可访问性的主要任务:
办理定向控制器点击
实施辅助API方法
发送AccessibilityEvent对象具体到您的自定义视图
填充AccessibilityEvent和AccessibilityNodeInfo您的看法
处理方向控制点击
在大多数设备上,点击使用定向控制器视图发送带有KEYCODE_DPAD_CENTER当前处于焦点的视图的KeyEvent。所有标准的Andr​​oid观点已经妥善处理KEYCODE_DPAD_CENTER。当建立一个自定义的视图控件,确保该事件有作为触摸屏上的观点相同的效果。
您的自定义控制也应该把KEYCODE_ENTER事件一样KEYCODE_DPAD_CENTER。这种方法使得从全键盘交互,为用户更容易。
实现无障碍API方法
可访问性事件是有关在您的应用程序的可视化界面组件用户的交互信息。这些消息由辅助服务,它使用在这些事件中的信息来产生附加的反馈和提示处理。在Android 4.0的(API等级14)和更高,产生的无障碍事件的方法已经扩展到提供比Android 1.6的(API级别4)推出的接口AccessibilityEventSource更详细的信息。扩展的辅助方法是View类的一部分,还有View.AccessibilityDelegate类。该方法如下:
sendAccessibilityEvent()
(API等级4),当用户需要在视图操作此方法被调用。该事件被归类为用户操作类型,如TYPE_VIEW_CLICKED。你通常不需要实现这个方法,除非你正在创建一个自定义视图。
sendAccessibilityEventUnchecked()
(API等级4)使用此方法时,调用代码需要直接控制设备上同时启用辅助检查(AccessibilityManager.isEnabled())。如果你这样做实现这个方法,你必须仿佛无障碍启用进行通话,而不管实际的系统设置。您通常并不需要实现自定义视图此方法。
dispatchPopulateAccessibilityEvent()
(API级别4)系统调用时,您的自定义视图生成一个可访问事件此方法。由于API级别14,这种方法的默认实现调用onPopulateAccessibilityEvent()对这一观点,然后对这一观点的每个孩子的dispatchPopulateAccessibilityEvent()方法。为了支持前4.0(API等级14),你必须为你的自定义视图,这是由辅助服务,如口语话语提示描述性文本覆盖此方法并填充的getText()的Andr​​oid的修订无障碍服务。
onPopulateAccessibilityEvent()
(API等级14)此方法设置AccessibilityEvent的口语文字提示你的看法。这种方法也被称为如果视图是产生一个可访问事件视图的孩子。
注:此方法中修改超出文本附加属性可能会覆盖通过其他方法设置属性。虽然你可以用这个方法修改无障碍事件的属性,您应该限制这些更改文本内容,并使用onInitializeAccessibilityEvent()方法来修改该事件的其他属性。
注意:如果您的本次活动的实施完全覆盖的输出文本,而不让你的布局,以修改其内容的其他部分,那就不叫超级实施这一方法在你的代码。
onInitializeAccessibilityEvent()
(API等级14)系统调用此方法来获取有关视图状态的更多信息,超越文本内容。如果您的自定义视图提供交互式控制超出了简单的TextView或按钮,你应该重写此方法,并使用这种方法,如密码字段类型,多选类型或提供用户交互或反馈状态设置一下您的看法附加信息到事件。如果你这样做重写此方法,则必须调用其超强的执行,然后只修改尚未设置由超级类属性。
onInitializeAccessibilityNodeInfo()
(API等级14)此方法提供无障碍服务有关视图的状态信息。默认视图实现了一组标准视图属性,但如果您的自定义视图提供交互式控制超出了简单的TextView或按钮,你应该重写此方法并设置你的看法变成用这种方法处理的AccessibilityNodeInfo对象的附加信息。
onRequestSendAccessibilityEvent()
(API等级14)系统调用时,您的视图的孩子产生AccessibilityEvent此方法。此步骤允许父视图附加信息修改的辅助活动。您应该实现此方法仅当您的自定义视图可以有子视图,如果父视图能够提供上下文信息可访问性事件将是无障碍服务非常有用。
为了支持自定义视图这些辅助方法,你应该采取下列方法之一:
如果你的应用目标的Andr​​oid 4.0(API级别14)和更高,覆盖并实现无障碍上述方法直接在您的自定义视图类上市。
如果您的自定义视图是为了与Android 1.6(API等级4)以上兼容,Android的支持库,版本5或更高版本,添加到项目中。然后,自定义视图类中,调用ViewCompat.setAccessibilityDelegate()方法来实现上面的辅助方法。对于这种方法的一个例子,看到了Android支持库(修订5或更高版本)的样品AccessibilityDelegateSupportActivity(<SDK> /演员/安卓/支持/ V4 /样本/ Support4Demos /)
在这两种情况下,你应该为实现您的自定义视图类以下辅助方法:
dispatchPopulateAccessibilityEvent()
onPopulateAccessibilityEvent()
onInitializeAccessibilityEvent()
onInitializeAccessibilityNodeInfo()
关于实现这些方法的详细信息,请参阅填充辅助活动。
发送辅助活动
根据您的自定义视图的细节,可以根据需要在不同的时间或不会被默认实现处理的事件发送AccessibilityEvent对象。视图类提供了这些事件类型的默认实现:
与API级别4开始:
TYPE_VIEW_CLICKED
TYPE_VIEW_LONG_CLICKED
TYPE_VIEW_FOCUSED
与API级别14开始:
TYPE_VIEW_SCROLLED
TYPE_VIEW_HOVER_ENTER
TYPE_VIEW_HOVER_EXIT
注意:将鼠标悬停事件是由触摸功能,利用这些事件作为触发用于提供用户界面元素声音提示的探索有关。
一般情况下,你应该发送AccessibilityEvent每当您的自定义视图更改的内容。例如,如果你要实现自定义滑块允许用户选择按向左或向右箭头数值,自定义视图应该发射型TYPE_VIEW_TEXT_CHANGED每当滑块值发生变化的事件。下面的示例代码演示如何使用sendAccessibilityEvent()方法来报告这一事件。

@Override
public boolean onKeyUp (int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {
        mCurrentValue--;
        sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED);
        return true;
    }
    ...
}
填充辅助活动
每个AccessibilityEvent有一组描述的看法的当前状态所需的属性。这些属性包括诸如视图的类名称,内容描述和检查状态。每个事件类型所需的特定性能的AccessibilityEvent参考文档中进行了描述。视图实现提供了这些属性的默认值。许多这些值,包括类名和事件时间戳的,被自动提供。如果要创建一个自定义视图组件,您必须提供有关该视图的内容和特点的一些信息。这个信息可以是一个按钮标签一样简单,但也可以包括要添加到事件的其他状态信息。
提供信息无障碍服务,自定义视图的最低要求是实现调度填充AccessibilityEvent()。该方法由系统调用,以请求信息为AccessibilityEvent,并与在Android 1.6(API等级4)和更高无障碍服务兼容您的自定义视图。下面的示例代码演示了这种方法的基本实现。

@Override
public void dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
    super.dispatchPopulateAccessibilityEvent(event);
    // Call the super implementation to populate its text to the event, which
    // calls onPopulateAccessibilityEvent() on API Level 14 and up.

    // In case this is running on a API revision earlier that 14, check
    // the text content of the event and add an appropriate text
    // description for this custom view:
    CharSequence text = getText();
    if (!TextUtils.isEmpty(text)) {
        event.getText().add(text);
    }
}
为Android 4.0(API等级14)和更高,使用onPopulateAccessibilityEvent()和onInitializeAccessibilityEvent()方法来填充或修改一个AccessibilityEvent的信息。使用onPopulateAccessibilityEvent()方法专门为添加或修改的情况下,这是由无障碍服务变成声音提示,如话语提示的文本内容。使用用于填充有关事件,其他信息onInitialize AccessibilityEvent()方法,如视图的选择状态。
此外,实施onInitialize AccessibilityNodeInfo()方法。用这种方法填充AccessibilityNodeInfo对象使用的无障碍服务进行调查,接受该事件后生成的可访问性事件视图层次结构,以获得更详细的上下文信息,并为用户提供适当的反馈。
下面的示例代码显示了如何重写这三种方法使用ViewCompat.setAccessibilityDelegate()。请注意,此示例代码要求对API等级4(修订版5或更高版本)的支持Android库添加到您的项目。

ViewCompat.setAccessibilityDelegate(new AccessibilityDelegateCompat() {
    @Override
    public void onPopulateAccessibilityEvent(View host, AccessibilityEvent event) {
        super.onPopulateAccessibilityEvent(host, event);
        // We call the super implementation to populate its text for the
        // event. Then we add our text not present in a super class.
        // Very often you only need to add the text for the custom view.
        CharSequence text = getText();
        if (!TextUtils.isEmpty(text)) {
            event.getText().add(text);
        }
    }
    @Override
    public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) {
        super.onInitializeAccessibilityEvent(host, event);
        // We call the super implementation to let super classes
        // set appropriate event properties. Then we add the new property
        // (checked) which is not supported by a super class.
        event.setChecked(isChecked());
    }
    @Override
    public void onInitializeAccessibilityNodeInfo(View host,
            AccessibilityNodeInfoCompat info) {
        super.onInitializeAccessibilityNodeInfo(host, info);
        // We call the super implementation to let super classes set
        // appropriate info properties. Then we add our properties
        // (checkable and checked) which are not supported by a super class.
        info.setCheckable(true);
        info.setChecked(isChecked());
        // Quite often you only need to add the text for the custom view.
        CharSequence text = getText();
        if (!TextUtils.isEmpty(text)) {
            info.setText(text);
        }
    }
}
在针对应用的Andr​​oid 4.0(API等级14)和更高版本,可以在自定义视图类直接实现这些方法。对于这种方法的另一个例子,看到了Android支持库(修订5或更高)样品AccessibilityDelegate SupportActivity中(<SDK> /演员/安卓/支持/ V4 /样本/ Support4Demos /)。
注意:您可能会发现在实施辅助功能到Android 4.0的描述了用于填充AccessibilityEvents的dispatchPopulateAccessibilityEvent()方法的书面自定义视图的信息。由于Android 4.0版本,但是,推荐的方法是使用onPopulate AccessibilityEvent()和onInitialize AccessibilityEvent()方法。
提供定制的无障碍环境
在Android 4.0的(API等级14),该框架得到了加强,使无障碍服务检查生成可访问事件的用户界面组件的含视图层次结构。该增强功能允许无障碍服务提供了更丰富的,用以帮助用户上下文信息。
有些情况下,无障碍服务无法从视图层次结构的足够信息。这样的一个例子是具有两个或更多个单独可点击区域,如日历控制的自定义接口控制。在这种情况下,服务不能获得足够的信息,因为可点击小节不是视图层次结构的一部分。

Android API Guides---Making Applications Accessible_第1张图片

图1.选择一天元素自定义日历视图。


在图1所示的例子中,整个日历实现为单个视图中,因此,如果不这样做别的,无障碍服务不会收到关于视图的视图中的内容和用户的选择的足够信息。例如,如果用户点击包含17天,可访问性框架只接收整个日历控件的描述信息。在这种情况下,话语提示辅助服务将简单地宣布“日历”,或者只是稍微好一点,“四月日历”,用户将留待知道选择什么日子。


在这样的情况下提供足够的上下文信息无障碍服务,该框架提供了一种方法来指定一个虚拟视图层次。虚拟视图层次是应用程序开发者提供了互补的视图层次到屏幕上的实际信息更加匹配的无障碍服务的一种方式。这种方法允许无障碍服务提供更多有用的上下文信息给用户。


其中,可能需要的虚拟视图层次的另一种情况是含有一组控件(次)一个用户界面,密切相关的功能,其中,在一个控制动作会影响一个或多个元素,的内容例如与单独一个数字选择器向上和向下的按钮。在这种情况下,因为在一个控制作用改变在另一内容和这些控制的关系可以不向服务是显而易见无障碍服务不能获得足够的信息。为了处理这种情况,组相关的控件与含有视图,并提供从这个容器的虚拟视图层次明确表示由控件提供的信息和行为。


为了给视图提供一个虚拟视图层次,在自定义视图或视图组覆盖getAccessibilityNodeProvider()方法,并返回AccessibilityNodeProvider的实现。举一个例子执行这一辅助功能,请参阅AccessibilityNodeProviderActivity在ApiDemos示例项目。您可以实现与Android 1.6及更高版本通过使用支持库与ViewCompat.getAccessibilityNodeProvider()方法,并提供与AccessibilityNodeProviderCompat实现兼容的虚​​拟视图层次。


处理自定义触摸事件


自定义视图控件可能需要非标准的触摸事件的行为。例如,一个自定义的控制可以使用onTouchEvent(MotionEvent)监听法检测ACTION_DOWN和ACTION_UP事件,并触发特殊click事件。为了保持与无障碍服务,处理这一定义点击事件必须执行以下代码兼容性:


生成的解释点击动作适当AccessibilityEvent。
启用无障碍服务执行对于谁是不能够使用触摸屏的用户自定义点击动作。
要处理的有效途径这些要求,你的代码应该重写performClick()方法,它必须调用超级此方法的实现,然后执行由点击事件所需的任何行动。当检测到自定义的点击动作,该代码应该再打电话给你performClick()方法。下面的代码示例演示了这种模式。

class CustomTouchView extends View {

    public CustomTouchView(Context context) {
        super(context);
    }

    boolean mDownTouch = false;

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);

        // Listening for the down and up touch events
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mDownTouch = true;
                return true;

            case MotionEvent.ACTION_UP:
                if (mDownTouch) {
                    mDownTouch = false;
                    performClick(); // Call this method to handle the response, and
                                    // thereby enable accessibility services to
                                    // perform this action for a user who cannot
                                    // click the touchscreen.
                    return true;
                }
        }
        return false; // Return false for other touch events
    }

    @Override
    public boolean performClick() {
        // Calls the super implementation, which generates an AccessibilityEvent
        // and calls the onClick() listener on the view, if any
        super.performClick();

        // Handle the action for the custom click here

        return true;
    }
}
上面显示的模式可确保定制的单击事件使用performClick()方法都产生一个辅助活动,提供一个切入点无障碍服务代表用户的行为来执行这个自定义click事件与无障碍服务兼容。
注意:如果您的自定义视图具有鲜明的点击区域,如自定义日历视图,您必须在您的自定义视图覆盖GET AccessibilityNodeProvider(),以便与无障碍服务兼容实现虚拟视图层次。
辅助测试
测试你的应用程序的可访问性是确保你的用户有一个伟大的体验的重要组成部分。您可以使用您的应用程序启用声音反馈,并只用定向控制你的应用程序中进行导航测试最重要的辅助功能。在应用程序上的测试辅助功能的更多信息,请参阅辅助功能测试清单。

你可能感兴趣的:(java,android,sdk,Accessibility)