Android布局主题样式

时间:2015-12-30 04:43:16

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

我的问题如下: 我有一些默认为主题的布局,这意味着它们具有白色背景。我的Ripple效果看起来很好,我的Widgets看起来很好。

Light Theme

当我使用黑暗主题或黑色主题时会出现问题。我的小工具变得不那么明显,我的Ripple也应该是白色的,对于较暗的主题。使用黑暗主题,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)

如何以较暗的主题布局正确显示它们(如上所述)而无误地对我的Widgets和Ripple进行主题化?

谢谢!

1 个答案:

答案 0 :(得分:1)

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

最近AppCompat的inflater似乎存在一些问题,看来在布局xml中从OnClick属性生成的OnClick处理程序没有正确处理ContextWrappers。解决方法是从xml中删除OnClick属性,并在代码中以编程方式注册OnClick侦听器。我孜孜不倦地在代码中明确地注册了我的所有点击事件,并从我的布局的xml文件中的小部件中删除了所有的onClick属性。这确实解决了它。

今天我发现我自己的应用程序使用AppCompat DayNight主题,更简单的修复是从根布局中删除“android:theme =”@ style / Theme.AppCompat.DayNight“。我现在可以回到使用小部件的xml中的onClick属性。我不知道其他AppCompat主题是否会导致同样的问题,但不会感到惊讶。我的主要活动使用AppCompatDelegate.setDefaultNightMode设置应用程序的主题。希望这有帮助,当我跑的时候我就在我身边在此之前,我的代码工作得非常好,直到我在Marshmallow中进行测试,并且找不到任何帮助,因为你可以看到你的问题在6个月内无法回答。