Android布局资源可访问性视觉障碍
Android应用程序目前支持基于方向、屏幕大小、昼夜等不同的布局资源 但是,我想为有视力障碍的用户提供布局,例如使用黄色背景和黑色文本的布局 我错过了Android已经支持的东西了吗Android布局资源可访问性视觉障碍,android,android-layout,android-view,android-accessibility,wai,Android,Android Layout,Android View,Android Accessibility,Wai,Android应用程序目前支持基于方向、屏幕大小、昼夜等不同的布局资源 但是,我想为有视力障碍的用户提供布局,例如使用黄色背景和黑色文本的布局 我错过了Android已经支持的东西了吗 我可以实现自定义的res/layout WAI或res/layout DDA文件夹吗 无法创建自定义配置限定符。 将列出当前支持的限定符 我将建议以下解决方法(示例): 为每个现有布局创建一个特殊的WAI布局,名称相同,但后缀为“\u WAI” 创建一种方法,以根据系统需要解析适当的布局。假设我们有一个方法is
我可以实现自定义的res/layout WAI或res/layout DDA文件夹吗 无法创建自定义配置限定符。 将列出当前支持的限定符 我将建议以下解决方法(示例):
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;
}
BaseActivity
类(或使用实用程序静态函数),该类将覆盖setContentView
方法。在这里,您将添加一个逻辑来选择布局
@Override
public void setContentView(int layoutResID) {
int newLayoutResID = resolveLayoutResourceID(layoutResID)
super.setContentView(newLayoutResID);
}
除非人们需要自己的布局(布局、gui元素的顺序),否则您可以实现一个可应用于每个布局的设置,而不是提供两个不同的布局,您可以在单个布局中参数化视图。因此,布局视图将从上下文主题中获取参数(例如背景颜色、文本颜色) 因此,这就是我们想要实现的目标:
<android.support.constraint.ConstraintLayout
android:background="?attr/bgColor"
... >
<TextView
android:textColor="?attr/textColor"
... />
</android.support.constraint.ConstraintLayout>
在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>
或者,如果必须在运行时执行此操作,则可以使用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发生更改时维护两个布局。这是正确的,但是,如果我可以提供WAI布局,并在用户启用任何其他可访问性功能(例如三次点击放大或对讲等)时自动向用户提供这些布局,则实施起来会更容易。通过编程更改样式,主题和字体要求我的开发人员编写更多需要测试和维护的代码行,而不是简单地提供一个替代布局。总的来说,我想说的是。。。如果Android提供了一个日夜交替的布局资源,为什么它不能摆脱无障碍布局呢?我喜欢这种方法。这是一个简单/聪明的解决方案,可以理解。谢谢你花时间回复我感谢你的方法。然而,主题和风格总是让我感到悲伤。我觉得布局方法更清晰。。。通过使用includes,我可以减少多重布局问题。
<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>
@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);
...
}
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);