Android 应用目前支持基于方向、屏幕大小、白天和黑夜等不同的布局资源。
但是,我想提供针对有视力障碍的用户的布局,例如使用带有黄色背景和黑色文本的布局。
我错过了 Android 已经支持的东西吗?
我可以实现自定义 res/layout-WAI 或 res/layout-DDA 文件夹吗?
Android 应用目前支持基于方向、屏幕大小、白天和黑夜等不同的布局资源。
但是,我想提供针对有视力障碍的用户的布局,例如使用带有黄色背景和黑色文本的布局。
我错过了 Android 已经支持的东西吗?
我可以实现自定义 res/layout-WAI 或 res/layout-DDA 文件夹吗?
您可以在单个布局中对视图进行参数化,而不是提供两种不同的布局。因此,您的布局视图将从它们膨胀的上下文主题中获取参数(例如背景颜色、文本颜色)。
所以,这就是我们想要实现的:
<android.support.constraint.ConstraintLayout
android:background="?attr/bgColor"
... >
<TextView
android:textColor="?attr/textColor"
... />
</android.support.constraint.ConstraintLayout>
?attr/someAttribute
将取自当前背景的主题。
attrs.xml
在in创建属性values/
:
<?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>
然后,在您的活动中执行断言并设置正确的主题:
@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 发生更改时维护两个布局。
您不能创建自定义配置限定符。当前支持的限定符在此处列出。
我将建议以下解决方法(示例):
为每个现有布局创建一个特殊的布局,名称相同,但后缀为“_wai”
example_layout.xml
example_layout_wai.xml
根据系统需要创建一种解决适当布局的方法。假设我们有一个方法 isWAI(),resolve 方法看起来像:
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 元素的排序),否则您可以使用可应用于每个布局的样式选择器来实现设置