Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android布局资源可访问性视觉障碍_Android_Android Layout_Android View_Android Accessibility_Wai - Fatal编程技术网

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

Android应用程序目前支持基于方向、屏幕大小、昼夜等不同的布局资源

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

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


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

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

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

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

  • 创建一种方法,以根据系统需要解析适当的布局。假设我们有一个方法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元素的顺序),否则您可以实现一个可应用于每个布局的设置,而不是提供两个不同的布局,您可以在单个布局中参数化视图。因此,布局视图将从上下文主题中获取参数(例如背景颜色、文本颜色)

    因此,这就是我们想要实现的目标:

    <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);