Android 辅助视力障碍的布局资源

Android layout resources for Accessibility vision impairment

Android 应用目前支持基于方向、屏幕尺寸、白天和黑夜等不同的布局资源

但是,我想提供针对有视力障碍的用户的布局,例如使用黄色背景和黑色文本的布局。

我是否错过了 Android 已经支持的内容?

我可以实现自定义 res/layout-WAI 或 res/layout-DDA 文件夹吗?

您无法创建自定义配置限定符。 当前支持的限定符列出 here.

我将建议以下解决方法(示例):

  1. 为每个现有的布局创建一个特殊的WAI布局,名称相同,但后缀为“_wai”

    example_layout.xml
    example_layout_wai.xml
    
  2. 创建一个方法来根据系统需要解决适当的布局。假设我们有一个方法 isWAI(),解析方法将类似于:

    public int resolveLayoutResourceID(int layoutResID) {
        int newLayoutResID = layoutResID;
        if (isWAI()) {
            String layoutResName = getResources().getResourceEntryName(layoutResID);
            String newLayoutResName = layoutResName + "_wai";
            newLayoutResID = getResources().getIdentifier(newLayoutResName, "layout", getPackageName());
        }
        return newLayoutResID;
    }
    
  3. 为所有 classes 创建一个 BaseActivity class(或使用实用程序静态函数),这将覆盖 setContentView 方法.在那里,您将向 select 布局添加逻辑。

    @Override
    public void setContentView(int layoutResID) {
        int newLayoutResID = resolveLayoutResourceID(layoutResID)
        super.setContentView(newLayoutResID);
    }
    

颜色(黄色背景和黑色文本)、字体和字体大小是 Styles and Themes 的主题。

除非视障人士需要自己的布局(gui 元素的排列、排序),否则您可以使用 a style chooser 实施可应用于每个布局的设置

您可以在单个布局中参数化视图,而不是提供两种不同的布局。因此,您的布局视图将从它们所膨胀的上下文主题中获取参数(例如背景颜色、文本颜色)。

所以,这就是我们想要实现的目标:

<android.support.constraint.ConstraintLayout
    android:background="?attr/bgColor"
    ... >

    <TextView
        android:textColor="?attr/textColor"
        ... />

</android.support.constraint.ConstraintLayout>

?attr/someAttribute 将取自当前上下文的主题。

values/ 中的 attrs.xml 创建属性:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <declare-styleable name="MyAttrs">
        <attr name="bgColor" format="reference|color"/>
        <attr name="textColor" format="color"/>
    </declare-styleable>

</resources>

styles.xml 中声明两个从共同主题扩展而来的主题:

<resources>

    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        ...
    </style>

    <style name="AppTheme.Default">
        <item name="bgColor">@color/red</item>
        <item name="textColor">@color/blue</item>
    </style>

    <style name="AppTheme.Accessibility">
        <item name="bgColor">@color/orange</item>
        <item name="textColor">@color/yellow</item>
    </style>

</resources>

然后,在您的 activity 中执行断言并设置正确的主题:

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    setTheme(isAccessibility ? R.style.AppTheme_Accessibility : R.style.AppTheme_Default);

    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_activity);
    ...
}

或者,如果您必须在运行时执行此操作,您可以使用 ContextThemeWrapper 为特定视图添加适当的主题。

Context wrapper = new ContextThemeWrapper(MyFragment.this.getContext(), R.style.AppTheme_Accessibility);
// inflating with a `wrapper`, not with the activity's theme
View themedView = View.inflate(wrapper, R.layout.some_layout, parent);

这种方法比提供两个单独的布局要好得多,因为当 UI.

中发生更改时,它会阻止您维护两个布局