最近,实现了这么一个功能,本来是将用户的登录注册、退登注销等做成了sdk,便于模块化复用。
这中间涉及到UI,公司多个项目最好是统一这方面的UI,才能实现完全复用。当然,一些小改动还是必要的,如设置状态栏颜色、页面背景等等。所以做了一些简单的UI可配置处理。
class JBUserCenterUIConfig: Serializable {
// 页面背景
@ColorInt
var pageBackgroundColor: Int = 0
// 页面背景
var pageBackgroundDrawable: Drawable? = null
// 状态栏
@ColorInt
var pageStatusBarColor: Int = 0
// 状态栏 深色or浅色 模式(默认深色)
var isStatusBarDarkMode: Boolean = true
// 底部导航栏
@ColorInt
var pageNavBarColor: Int = 0
// 标题栏
@ColorInt
var pageTitleBarColor: Int = 0
// card color
@ColorInt
var pageCardColor: Int = 0
// 分割线颜色
@ColorInt
var pageCardDividerColor: Int = 0
// 标题文字
var pageTitle: String? = ""
// 标题文字颜色
@ColorInt
var pageTitleColor: Int = 0
// 固定显示文本的颜色
@ColorInt
var pageStableTextColor: Int = 0
// 文本需要透明的颜色
@ColorInt
var pageAlphaTextColor: Int = 0
// 高亮颜色(一般用于确定按钮的背景等)
@ColorInt
var pageHighLightColor: Int = 0
// 左上角返回箭头
var pageBackArrow: Drawable? = null
// 透明的指示小箭头
var pageAlphaLabelArrow: Drawable? = null
// edit clear icon
var pageEditClearIcon: Drawable? = null
}
那么在宿主应用即可以实现UI配置
/**
* 定制用户中心相关UI(个人信息页、绑定页等)
*/
private fun generateUserCenterUI() {
val jbUserConfig = JBUserCenterConfig()
// 个人信息
jbUserConfig.userInfoUIConfig = JBUserCenterUIConfig().also {
it.pageBackgroundDrawable = ResourceManager.getDrawable(R.drawable.app_weather_common_bg)
it.pageTitleColor = Color.parseColor("#FFFFFF")
it.pageStatusBarColor = Color.parseColor("#364175")
it.pageNavBarColor = Color.parseColor("#55629A")
it.pageCardColor = Color.parseColor("#66000000")
it.pageCardDividerColor = Color.parseColor("#1aeeeeee")
it.isStatusBarDarkMode = false
// 文字
it.pageTitleColor = Color.parseColor("#FFFFFF")
it.pageStableTextColor = Color.parseColor("#FFFFFF")
it.pageAlphaTextColor = Color.parseColor("#99FFFFFF")
// 图标
it.pageBackArrow = ResourceManager.getDrawable(R.mipmap.nav_ic_back_white)
it.pageAlphaLabelArrow = ResourceManager.getDrawable(R.mipmap.icon_arrow_alpha_right)
}
// 绑定手机号
jbUserConfig.bindUIConfig = JBUserCenterUIConfig().also {
it.pageBackgroundDrawable = ResourceManager.getDrawable(R.drawable.app_weather_common_bg)
it.pageTitleColor = Color.parseColor("#FFFFFF")
it.pageStatusBarColor = Color.parseColor("#364175")
it.pageNavBarColor = Color.parseColor("#55629A")
it.pageCardColor = Color.parseColor("#66000000")
it.pageCardDividerColor = Color.parseColor("#1aeeeeee")
it.isStatusBarDarkMode = false
// 文字
it.pageTitleColor = Color.parseColor("#FFFFFF")
it.pageStableTextColor = Color.parseColor("#FFFFFF")
it.pageAlphaTextColor = Color.parseColor("#99FFFFFF")
it.pageHighLightColor = Color.parseColor("#3ABEFF")
// 图标
it.pageBackArrow = ResourceManager.getDrawable(R.mipmap.nav_ic_back_white)
it.pageEditClearIcon = ResourceManager.getDrawable(R.mipmap.icon_edit_clear)
}
JBUserCenterUIConfigManager.setJBUserCenterUIConfig(jbUserConfig)
}
这里做一下延伸记录:动态设置背景
通常,在xml中设置背景
android:background
可以是颜色,图片,shape等。
如果想在代码中动态设置,则要知道相应的api。
1、background对应的动态属性值修改方法是setBackgroundResource
2、setBackgroundResource(@DrawableRes int resid),可支持颜色,图片,shape等
如setBackgroundResource(R.color.white)
3、拓展一下,跟setBackgroundResource对应的还有:
setBackground(Drawable background)
setBackgroundDrawable(Drawable background)
setBackgroundColor(@ColorInt int color)
前面两种使用Drawable类型设置,Drawable可通过resource.getDrawable(resId)获取资源或者自定义Drawable,第三种支持ColorInt类型。
所以,准确来说,background对应的代码是setBackgroundResource、setBackground、
setBackgroundDrawable、setBackgroundColor。
1. Color.parseColor("#FFFFFF"),返回类型ColorInt.
2. Color.rgb(255,255,255),返回类型ColorInt.
3. Resources resource = (Resources) getResources();
ColorStateList csl = (ColorStateList) resource.getColorStateList(R.color.white);
遇到因为设置颜色资源类型不正确,导致报错如下:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.xxx/com.xxx.activity.JBUserLoginActivity}: android.content.res.Resources$NotFoundException: Resource ID #0xff000000
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3488)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3635)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2175)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:237)
at android.app.ActivityThread.main(ActivityThread.java:7860)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1075)
Caused by: android.content.res.Resources$NotFoundException: Resource ID #0xff000000
at android.content.res.ResourcesImpl.getValueForDensity(ResourcesImpl.java:259)
at android.content.res.Resources.getDrawableForDensity(Resources.java:920)
at android.content.res.Resources.getDrawable(Resources.java:860)
at android.content.Context.getDrawable(Context.java:689)
at android.view.View.setBackgroundResource(View.java:24579)
at com.xxx.activity.JBUserLoginActivity.onViewInitialized(JBUserLoginActivity.kt:72)
at com.xxx.Activity.onCreate(KiiBaseActivity.kt:56)
at android.app.Activity.performCreate(Activity.java:7955)
at android.app.Activity.performCreate(Activity.java:7944)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1307)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3463)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3635)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2175)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:237)
at android.app.ActivityThread.main(ActivityThread.java:7860)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1075)