3

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

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

我错过了 Android 已经支持的东西吗?

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

4

3 回答 3

1

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

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

<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 发生更改时维护两个布局。

于 2017-08-01T09:46:06.667 回答
1

您不能创建自定义配置限定符。当前支持的限定符在此处列出。

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

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

    example_layout.xml
    example_layout_wai.xml
    
  2. 根据系统需要创建一种解决适当布局的方法。假设我们有一个方法 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;
    }
    
  3. 为所有类创建一个BaseActivity类(或使用实用程序静态函数),它将覆盖该setContentView方法。在那里,您将添加一个逻辑来选择布局。

    @Override
    public void setContentView(int layoutResID) {
        int newLayoutResID = resolveLayoutResourceID(layoutResID)
        super.setContentView(newLayoutResID);
    }
    
于 2017-08-01T09:17:44.023 回答
1

颜色(黄色背景和黑色文本)、字体和字体大小是样式和主题的主题

除非视力受损的人需要自己的布局(排列、gui 元素的排序),否则您可以使用可应用于每个布局的样式选择器来实现设置

于 2017-08-01T09:40:58.277 回答