Android 辅助视力障碍的布局资源
Android layout resources for Accessibility vision impairment
Android 应用目前支持基于方向、屏幕尺寸、白天和黑夜等不同的布局资源
但是,我想提供针对有视力障碍的用户的布局,例如使用黄色背景和黑色文本的布局。
我是否错过了 Android 已经支持的内容?
我可以实现自定义 res/layout-WAI 或 res/layout-DDA 文件夹吗?
您无法创建自定义配置限定符。
当前支持的限定符列出 here.
我将建议以下解决方法(示例):
为每个现有的布局创建一个特殊的WAI布局,名称相同,但后缀为“_wai”
example_layout.xml
example_layout_wai.xml
创建一个方法来根据系统需要解决适当的布局。假设我们有一个方法 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;
}
为所有 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.
中发生更改时,它会阻止您维护两个布局
Android 应用目前支持基于方向、屏幕尺寸、白天和黑夜等不同的布局资源
但是,我想提供针对有视力障碍的用户的布局,例如使用黄色背景和黑色文本的布局。
我是否错过了 Android 已经支持的内容?
我可以实现自定义 res/layout-WAI 或 res/layout-DDA 文件夹吗?
您无法创建自定义配置限定符。 当前支持的限定符列出 here.
我将建议以下解决方法(示例):
为每个现有的布局创建一个特殊的WAI布局,名称相同,但后缀为“_wai”
example_layout.xml example_layout_wai.xml
创建一个方法来根据系统需要解决适当的布局。假设我们有一个方法 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; }
为所有 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.
中发生更改时,它会阻止您维护两个布局