一般动态换肤的框架,网上都有很多。其核心的方法都是实现LayoutInflater.Factory2类,在onCreateView方法中实现创建view并使用皮肤包的资源。大体代码如下:
import android.content.Context
import android.content.res.Resources
import android.os.Build
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import android.widget.ImageView
import android.widget.TextView
class SkinFactory : LayoutInflater.Factory2 {
var viewMap = mutableMapOf<View, SkinView>()
override fun onCreateView(parent: View?, name: String?, context: Context?, attrs: AttributeSet?): View? {
return attrs?.let {
var textColorId = getAttributeResourceValue(it, "textColor")
var srcId = getAttributeResourceValue(it, "src")
if (srcId == 0)
srcId = getAppResourceValue(it, "srcCompat")
var backgroundId = getAttributeResourceValue(it, "background")
if (textColorId != 0 || backgroundId != 0 || srcId != 0) {
return@let createView(context!!, name!!, attrs!!)?.let { view ->
with(SkinView(textColorId = textColorId,
backgroundId = backgroundId,
srcId = srcId)) {
viewMap[view] = this
applySkin(view, this)
}
return@let view
}
}
return@let null
}
}
/**
* 通过[name]获取[attrs]里[http://schemas.android.com/apk/res/android]下的资源id
*/
private fun getAttributeResourceValue(attrs: AttributeSet, name: String): Int {
return attrs.getAttributeResourceValue("http://schemas.android.com/apk/res/android", name, 0)
}
/**
* 通过[name]获取[attrs]里[http://schemas.android.com/apk/res-auto]下的资源id
*/
private fun getAppResourceValue(attrs: AttributeSet, name: String): Int {
return attrs.getAttributeResourceValue("http://schemas.android.com/apk/res-auto", name, 0)
}
/**
* 创建view
*/
private fun createView(context: Context, name: String, attrs: AttributeSet): View? {
var view: View?