Android 布局主题样式

标签 android android-layout material-design android-theme ripple

我的问题如下: 我有一些默认情况下以浅色为主题的布局,这意味着它们具有白色背景。我的涟漪效果看起来不错,我的小部件看起来也不错。

Light Theme

当我使用深色主题或黑色主题时会出现问题。我的小部件变得不那么明显了,我的波纹也变得不那么明显了,对于较暗的主题应该是白色的。使用深色主题的 Ripple 看起来像这样。

Dark Theme

在深色主题上,波纹仅部分可见,因为背景颜色为 #303030,比 #000000 的波纹更浅。理想情况下,波纹应该是白色的。在黑色主题布局上,波纹是不可见的,因为背景和波纹都是黑色的。 我实际上已经通过使用解决了这个问题

android:theme="ThemeOverlay.AppCompat.Dark" 

在我的布局中。如果我使用它,波纹是白色的,小部件也更明显。问题是,当我点击像第一个开关这样的小部件时,应用程序崩溃并给我留下了一个无意义的错误。

编辑: 错误如下:

12-29 23:57:39.801 13055-13055/com.company.app E/AndroidRuntime: FATAL EXCEPTION: main
                                                           Process: com.company.app, PID: 13055
                                                           java.lang.IllegalArgumentException: Expected receiver of type com.company.app.SettingsActivity, but got android.view.ContextThemeWrapper
                                                               at java.lang.reflect.Method.invoke(Native Method)
                                                               at android.view.View$DeclaredOnClickListener.onClick(View.java:4453)
                                                               at android.view.View.performClick(View.java:5204)
                                                               at android.widget.CompoundButton.performClick(CompoundButton.java:122)
                                                               at android.view.View$PerformClick.run(View.java:21153)
                                                               at android.os.Handler.handleCallback(Handler.java:739)
                                                               at android.os.Handler.dispatchMessage(Handler.java:95)
                                                               at android.os.Looper.loop(Looper.java:148)
                                                               at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                               at java.lang.reflect.Method.invoke(Native Method)
                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

我怎样才能以这样的方式为我的小部件和我的 Ripple 设置主题,以便在较暗的主题布局上正确显示它们(如上所述)而不会出错?

谢谢!

最佳答案

我的 AppCompat 子类 Activity 遇到了这个问题。我努力搜索并在 Android 的问题跟踪器中发现以下问题:https://code.google.com/p/android/issues/detail?id=174871

AppCompat 的充气器最近似乎出现了一些问题,从布局 xml 中的 OnClick 属性生成的 OnClick 处理程序似乎无法正确处理 ContextWrappers。解决方法是从您的 xml 中删除 OnClick 属性,并在您的代码中以编程方式注册 OnClick 监听器。我认真地在代码中显式注册了我所有的点击事件,并从布局的 xml 文件中的小部件中删除了所有 onClick 属性。那确实解决了它。

今天我发现我自己的应用程序使用 AppCompat DayNight 主题,一个更简单的解决方法是从根布局中删除“android:theme="@style/Theme.AppCompat.DayNight"。我现在可以回去使用小部件的 xml 中的 onClick 属性。我不知道其他 AppCompat 主题是否会导致同样的问题,但不会感到惊讶。我的主要 Activity 使用 AppCompatDelegate.setDefaultNightMode 设置应用程序的主题。希望这会有所帮助,我跑的时候在旁边在此方面,我的代码在 Marshmallow 中进行测试之前一直运行良好,而且几乎找不到任何帮助,正如您所看到的,您的问题在 6 个月内都没有得到解答。

关于Android 布局主题样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34523015/

相关文章:

android - 如何制作像redbus一样的座位预订布局

android - 类似于 WhatsApp 消息的相对布局

java - 使用暂停和恢复选项从后台服务在 TextView 中设置运行计时器

android - 将多种产品 flavor 与 flavor 维度组合时,文件 google-services.json 丢失

android - 使用 Android 4.0 风格的切换按钮

android - 更新支持库后 RecyclerView 无法工作

java - 如何设置与主题颜色不同的 gwt Material 元素的颜色?

android - 如何通过滚动本身来防止隐藏工具栏

java - 没有名字的静态方法

Android:以编程方式设置单选按钮文本的背景颜色