最近,實作了這麼一個功能,本來是将使用者的登入注冊、退登登出等做成了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)