ERROR) {
Log.e(tag, msg)
这段代码清晰易懂。使用的时候就和普通日志一样:
LogUtil.v("tag", "verbose")
只需要通过修改level变量的值,就可以自由地控制日志的打印。比如让level等于VERBOSE就可以把所有的日志都打印出来,让level等于ERROR就可以只打印程序的错误日志。使用了这种方法,在开发阶段将level指定成VERBOSE,当项目正式上线的时候将level指定成ERROR就可以了。
4 调试Android程序
学习一下如何让程序随时进入调试模式,先正常启动程序,进行一些操作之后,需要开始调试的时候,点击AS顶部工具栏的“AttachDebugger to Android Process”按钮,会弹出一个进程选择框,选择我们当前程序的进程,就会进入调试状态了。
5 深色主题
想要实现最佳的深色主题效果,应该针对每一个界面都进行浅色和深色两种主题的界面设计。不过我们还是有技巧的。
我们现在是有一个DayNight主题的,表示当用户在系统中开启深色主题时,应用程序会自动使用深色主题,反之就是浅色主题。新建项目时是自动应用了这个主题的,可以看到style.xml中的代码:
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.MaterialTest" parent="Theme.MaterialComponents.DayNight.NoActionBar">
</style>
</resources>
不过运行程序,开启深色主题的效果如下:
效果还是不错,只可惜标题栏和悬浮按钮没有变化,原因是它们使用的是定义在colors.xml文件中的颜色值,如下:
<resources>
<color name="purple_200">#FFBB86FC</color>
<color name="purple_500">#FF6200EE</color>
<color name="purple_700">#FF3700B3</color>
</resources>
这种指定颜色值的引用方式相当于对控件颜色的硬编码,DayNight主题是不能对这些颜色动态转换的。
解决办法呢就是进行主题差异性编程,在values-night目录下新建一个colors.xml文件,在里面指定深色主题下颜色值:
<resources>
<color name="purple_200">#303030</color>
<color name="purple_500">#232323</color>
<color name="purple_700">#343737</color>
</resources>
这些颜色的name要统一,因为第一个colors.xml文件中使用的是这种命名方式,所以我直接复制过来就只更改了颜色值。结果如下:
效果还是不错的,使用主题差异性编程几乎可以解决所有的适配问题,但是在DatNight主题下,最好还是尽量减少硬编码的方式来指定控件颜色。而是应该更多地使用能够根据当前主题自动切换颜色的主题属性。
比如说黑字应该衬托在白色的背景下,反之白字通常应该衬托在黑色的背景下,那么此时可以使用主题属性来指定背景以及文字的颜色,写法如下:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?android:attr/colorBackground">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="hello world"
android:textSize="42sp"
android:textColor="?android:attr/textColorPrimary" />
</FrameLayout>
这些主题属性会自动根据系统当前的主题模式选择最合适的颜色来呈现。
如果需要在不同主题下执行不同的代码,使用的时候就判断一下当前系统是否为深色主题:
fun isDarkTheme(context: Context): Boolean {
val flag = context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
return flag == Configuration.UI_MODE_NIGHT_YES
Kotlin是取消了按位运算符的写法的,改成了英文关键字,比如and关键字就对应了Java中的&运算符,or关键字对应|运算符,xor关键字对应^运算符。