Yet another solution for changing day-night mode without recreating activity
Inspired by appcompat-v7.
When we change the UiMode, let SkinnableActivity
to notify every view in the hierarchy to call applyDayNight
function if it implements the Skinnable
interface.
We record the resource id in view constructor when inflating it, and get current resource after apply UiMode in applyDayNight
function.
Gradle:
allprojects { repositories { ... maven { url "https://jitpack.io" } } } dependencies { compile 'com.github.geminiwen:SkinSprite:v1.1' }
drawable-night
/ values-night
folder etc. SkinnableActivity
which extends AppCompatActivity
android:configChanges="uiMode"
in your Activity Declare in AndroidManifest.xml setDayNightMode
when you want change the DayNightMode Skinnable
interface when you create your own view See in app
folder.
Implement more components like AppCompat components.
虽然好想说请忽略上面的语法错误 :P
Skin Sprite 是另一种不重启 Activity
切换Android夜间模式的库, 只支持 Api 14以上
我们把所有可以换肤的 Activity
都继承自 SkinnableActivity
, 每次需要换肤的时候就调用 setDayNightMode
函数, 它会去通知 View
层级中所有实现了 Skinnable
接口的对象. 调用他们的 applyDayNight
方法, 来切换他们的样式.
我们在 View
生成的时候, 记录下了它引用的一些资源id, 然后因为切换了 UiMode
后, 获取相同资源 id 得到的实质资源不一样的特性来完成夜间模式切换的方案.
res
文件夹中分别使用 drawable
, drawable-night
, values
, values-night
等文件夹进行区分. Activity
继承于 SkinnableActivity
, 它本身是继承于 AppCompatActivity
的, 和 appcompat-v7
库深度整合. AndroidManifest.xml
中的 activity
声明标签里加入 android:configChanges="uiMode"
, 这样才不会重启Activity setDayNightMode
Skinnable
接口, 实现里面的方法, 具体可参照库内源码. 看本 repo 下面的 app
文件夹内的用法.