天天看點

android動态設定背景

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