Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/179.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_Xml_View_Colors - Fatal编程技术网

Android 如何一次性否定视图的颜色?

Android 如何一次性否定视图的颜色?,android,xml,view,colors,Android,Xml,View,Colors,在问这个问题之前,我已经做了一些研究,也找了一些类似的问题,但似乎没有一个能回答这个问题 我计划在我的android应用程序中提供视觉可访问性功能,用户可以一次性取消UI的颜色(比如说一个简单的按钮取消颜色) 但也有少数例外。为了可读性,即使用户选择否定颜色,也很少有视图(比如操作栏)的颜色最好是固定的 我可以想出几个选项来实现同样的目标: 维护每个布局xml的两个副本—一个具有正常颜色视图,另一个具有否定颜色视图。现在,每当用户选择否定颜色时,只需在java中加载相应的xml即可 在color

在问这个问题之前,我已经做了一些研究,也找了一些类似的问题,但似乎没有一个能回答这个问题

我计划在我的android应用程序中提供视觉可访问性功能,用户可以一次性取消UI的颜色(比如说一个简单的按钮取消颜色)

但也有少数例外。为了可读性,即使用户选择否定颜色,也很少有视图(比如操作栏)的颜色最好是固定的

我可以想出几个选项来实现同样的目标:

  • 维护每个布局xml的两个副本—一个具有正常颜色视图,另一个具有否定颜色视图。现在,每当用户选择否定颜色时,只需在java中加载相应的xml即可
  • 在color.xml中维护每个视图的两个颜色副本。在两个不同的主题下定义它们。现在根据用户需要设置相应的主题
  • 挑战:
    可伸缩性:鉴于应用程序已经使用了数百个视图、数百个XML,并且在未来的更新中将使用越来越多的视图,我该如何处理这些问题

    问题:
    1.考虑到可伸缩性,哪个选项更适合这种情况。
    2.还有其他方法可以做到这一点吗?

    3.是否有任何android API提供视图的否定颜色?

    在我看来,最好的方法是在应用程序中维护正常主题和否定主题,然后根据用户设置,在运行时更改主题

    这种方法有一个缺点,即在活动中必须在
    setContentView
    之前
    setTheme
    。这意味着您不能在用户单击按钮后立即反映更改。这就是说,在我看来,这是最好的解决方案,因为它可以很好地扩展,并且您可能有一个BaseActivity,您的所有活动都可以从它继承,它可以设置您的主题

    setTheme(userBlackTheme? android.R.style.Theme_Dark : android.R.style.Theme_Light);
    super.onCreate(savedInstanceState); //IMPORTANT: setTheme is before the super call!!!
    setContentView(R.layout.main);
    
    如果您在屏幕上有一个按钮并希望执行此操作,那么您应该能够交换视图上的所有样式属性,并将它们替换为暗属性。也就是说,虽然您不会更改主题,但可以将每个视图的属性更改为黑暗主题的属性

    然后,您必须递归地遍历所有视图,并根据视图的类别将其属性更改为暗/亮

    public void recursiveLoopChildren(ViewGroup parent) {
        for (int i = parent.getChildCount() - 1; i >= 0; i--) {
            final View child = parent.getChildAt(i);
            if (child instanceof ViewGroup) {
                ((ViewGroup) child).setBackgroundColor(useDarkTheme? Color.BLACK : Color.WHITE);
                recursiveLoopChildren((ViewGroup) child);
    
                // DO SOMETHING WITH VIEWGROUP, AFTER CHILDREN HAS BEEN LOOPED 
            } else { 
                if (child instanceof TextView) {
                    ((TextView) child).setTextColor(...);
                } 
            } 
        } 
    } 
    

    简言之,您可能希望实现这两个功能,使用选项1,所有新活动都将使用带有选项2的暗主题。当您单击“更改主题”按钮时,您当前的活动将被更改。或单击更改主题的按钮后,重新加载当前活动(对用户来说不是那么优雅),也许您可以使用深色主题重新加载相同的活动,并将其淡入浅色主题上方,然后在浅色主题上调用
    finish()
    ,在简化您的生活的同时提供良好的过渡。希望这能有所帮助。

    感谢您的详细回复:)不过我对主题方法没有什么疑问。如何定义主题中的每个视图颜色?那么它将如何适应单一的xml方法模型呢?您可以为主题中的每个视图定义样式,这有点麻烦,我们习惯于在布局xml中内联使用大量格式。我建议先用一个简单的屏幕试一下,然后用更复杂的屏幕。我可以告诉你,这是可能的,因为它主要意味着将默认背景颜色设置为白色或黑色,并设置主要、次要和第三文本颜色。xml内部的格式设置是我最不关心的(至少现在)。我从你的解释中了解到的是:定义两个主题。然后在每个主题内定义每个视图样式的两个版本。那么,xml视图所持有的颜色值是多少?我担心应用如此沉重的主题来改变每个视图的颜色会在应用程序中产生巨大的运行成本。你可以为屏幕设置主题并计时以查看效果。我认为你不应该担心,我会在调用onCreate的
    super
    之前应用
    setTheme
    。我刚刚编写了一个快速的示例应用程序来实现这一点,它似乎按照预期工作。