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) 
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值