1. 内容

娱乐性质的APP如果有修改主题的功能,会给这款APP增色不少。关于Android APP当中,做主题工作相关工作比较好的,要属腾讯QQ了。本文将对APP修改主题做简要分析实现。

2. 实现步骤说明

2.1 setTheme方法的调用

Android当中修改主题主要使用setTheme()方法实现,Android API中,对setTheme()方法的说明如下:

public void setTheme (int resid)

Added in  API level 1

Set the base theme for this context. Note that this should be called before any views are instantiated in the Context (for example before calling setContentView(View) orinflate(int, ViewGroup)).

Parameters
resid The style resource describing the theme.

API对setTheme的说明中有一点需要注意,即

“Note that this should be called before any views are instantiated in the Context (for example before calling setContentView(View) or inflate(int, ViewGroup)).”

setTheme(int)方法需要在调用setContentView(View)或者inflate(int, ViewGroup)初始化View之前调用才有效。因此,我们需要在Activity的onCreate方法中,同时在setContentView(View)方法之前调用setTheme(int)方法。而根据Activity的生命周期,我们可以知道,onCreate方法在Activity生命周期当中只调用一次,如果我们需要调用setTheme(int)方法修改Activity的主题,就必须尝试从新调用onCreate方法,重新调用onCreate方法的有一下两种方式:

  1. 显示调用Activity的finish()方法结束Activity,然后调用startActivity打开Activity。
  2. 设置Intent的标志为FLAG_ACTIVITY_CLEAR_TOP,startActivity重新开启一个Activity。
方法1由于出现了Activity的显示关闭和开启,切换过程中会出现瞬间的黑屏。而方法2没有显示调用finish方法,主题切换过程不会出现黑屏的现象,推荐使用。

2.2 自定义属性与其调用

        修改View中不同组件的颜色时,可使用两种方式,
  1. 复写Android当中原生的属性,如

     <item name="android:windowBackground">@color/bgcolor</item>

    这种方式,对于不同的样式,对android:windowBackground赋予不同的值即可。

  2. 自定义属性,对于不同的样式,对同一属性赋予不同的值。

自定义属性的方式如下:

<?xml version="1.0" encoding="utf-8"?>
<resources><!-- View styles --><attr name="pageBackground" format="reference" /><attr name="pagePaddingLayout" format="reference" /><attr name="textTitle" format="reference" /><attr name="textTitleHidden" format="reference" /><attr name="textSubheader" format="reference" /><attr name="textLarge" format="reference" /><attr name="textRegular" format="reference" /><attr name="textCheckBox" format="reference" /><attr name="textCurrentActivityGreen" format="reference" /><attr name="whiteBackground" format="reference" /><attr name="button" format="reference" /><attr name="list" format="reference" /><attr name="listItem" format="reference" /><attr name="listDivider" format="reference" /><attr name="editText" format="reference"/><attr name="background" format="reference" /><!-- Attributes --><attr name="pageMargin" format="reference|dimension" /><attr name="contentLeftMargin" format="reference|dimension" /></resources>

对于不同属性所对应的值的定义如白色属性定义如下:

<style name="Theme.White"><item name="pageBackground">@style/page_background_wh</item><item name="pagePaddingLayout">@style/page_padding_layout_wh</item>       <item name="textTitle">@style/text_title_wh</item><item name="textTitleHidden">@style/text_title_hidden_wh</item><item name="textSubheader">@style/text_subheader_wh</item><item name="textLarge">@style/text_large_wh</item><item name="textRegular">@style/text_regular_wh</item><item name="textCheckBox">@style/text_check_box_wh</item><item name="textCurrentActivityGreen">@style/text_current_activity_green_wh</item><item name="whiteBackground">@style/white_background_wh</item><item name="button">@style/button_wh</item><item name="list">@style/list_wh</item><item name="listItem">@style/list_item_wh</item><item name="listDivider">@style/list_divider_wh</item><item name="pageMargin">@dimen/page_margin_wh</item><item name="background">@drawable/background1</item></style>

蓝色定义如下:

<style name="Theme.Blue"><item name="pageBackground">@style/page_background_bl</item><item name="pagePaddingLayout">@style/page_padding_layout_bl</item>        <item name="textTitle">@style/text_title_bl</item><item name="textTitleHidden">@style/text_title_hidden_bl</item><item name="textSubheader">@style/text_subheader_bl</item><item name="textLarge">@style/text_large_bl</item><item name="textRegular">@style/text_regular_bl</item><item name="textCheckBox">@style/text_regular_bl</item><item name="whiteBackground">@style/white_background_bl</item><item name="button">@style/button_bl</item><item name="list">@style/list_bl</item><item name="listItem">@style/list_item_bl</item><item name="listDivider">@style/list_divider_bl</item><item name="pageMargin">@dimen/page_margin_bl</item><item name="background">@drawable/background2</item></style>

自定义属性的调用方式如下:

  <ScrollViewandroid:background="?background"android:layout_width="fill_parent"android:layout_height="0px"android:layout_weight="1" >
</ScrollView>

其中?代表引用主题属性。这样,对于不同的样式,ScrollView的背景图片显示便不同了,Theme.White样式时显示为@drawable/background1,而Theme.Blue显示为@drawable/background2。

2.3 步骤说明

  1. 编辑自定义属性。
  2. 对不同样式所对应的自定义属性值进行赋值操作。
  3. 对用户选定的style保存到SharePreference当中。
  4. 读取SharePreference当中用户选定样式,调用setTheme方法。

3. 更换样式APP效果图

3. 应用程序下载地址

应用程序下载地址

4. QQ修改主题的实现

        QQ修改主题的实现也采用了类似的方式,反编译AndroidQQ客户端查看其源码,从ThemeDownloadAndSetActivity类中可知QQ下载主题的界面是一个Web页面其地址为:http://mobile.biaoqing.qq.com/business/theme/html/index.html?uin=[uin]&client=[client]&version=[version]&sid=[sid]&platformId=[platformId]&device=[device]&system=[system]&density=[density]&adTag=mvip.gongneng.android.theme.index_dynamic_tab&updateFlag=[updateFlag]&_bid=123%22,其使用ThemeJsHandler类对主题进行了下载操作。下载地址如“白色简约”主题地址为http://dl.url.cn/msoft/mobileQQ_theme/theme_package_android/ios7-theme.1.0.3.zip,主题下载下来之后,使用SkinEngine对主题进行处理,更换APP主题。
其中,styles.xml文件中定义了theme_skin_default如下:
<style name="theme_skin_default" parent="@style/qzone_theme_customerTitle"><item name="android:textColorPrimary">@color/red</item><item name="android:textColorSecondary">@color/qzone_white</item><item name="android:textColorTertiary">@color/gray</item><item name="audio_select_top_background">@style/audio_select_top_background_style_default</item><item name="audio_select_click_background">@style/audio_select_click_background_style_default</item><item name="text_nick_name">@style/text_nick_name_default</item><item name="text_tab_name">@style/text_tab_name_default</item><item name="text_audio_select_name">@style/text_audio_select_name_default</item><item name="text_audio_to">@style/text_audio_to_default</item><item name="text_title">@style/text_title_default</item><item name="text_qq_accept">@style/text_qq_accept_default</item><item name="text_qq_ignore">@style/text_qq_ignore_default</item><item name="text_qq_batch_all">@style/text_qq_batch_all_default</item><item name="text_qq_http_cancel">@style/text_qq_http_cancel_default</item><item name="text_qq_http_refresh">@style/text_qq_http_refresh_default</item><item name="text_personinfo">@style/text_personinfo_default</item><item name="text_content">@style/text_content_default</item><item name="text_time">@style/text_time_default</item><item name="text_time_in_tab">@style/text_time_in_tab_default</item><item name="text_uploading">@style/text_uploading_default</item><item name="text_reply">@style/text_reply_default</item><item name="no_app_short">@style/no_app_short_default</item><item name="text_summary">@style/text_summary_default</item><item name="text_home_tab_highlight">@style/text_home_tab_highlight_default</item><item name="button_bg">@style/button_bg_default</item><item name="button_bg_sign">@style/button_bg_sign_default</item><item name="button_bg_shortedit">@style/button_bg_shortedit_default</item><item name="button_text">@style/button_text_default</item><item name="list_bg">@style/list_bg_default</item><item name="next_step_bg">@style/next_step_bg_default</item><item name="item_uploading_bg">@style/item_uploading_bg_default</item><item name="item_uploading_now_bg">@style/item_uploading_now_bg_default</item><item name="list_item_bg">@style/list_item_bg_default</item><item name="edit_style">@style/edit_style_default</item><item name="text_comment">@style/text_comment_default</item><item name="tab_selection_bg">@style/tab_selection_bg_default</item><item name="feed_header_bg">@style/feed_header_bg_default</item><item name="feed_header_content">@style/feed_header_content_default</item><item name="feed_header_time">@style/feed_header_time_default</item><item name="comment_header">@style/comment_header_default</item><item name="list_bg_divider">@style/list_bg_divider_default</item><item name="friendlist_bg_divider">@style/friendlist_bg_divider_default</item><item name="list_divider">@style/list_divider_default</item><item name="img_divider">@style/img_divider_default</item><item name="write_footer">@style/write_footer_default</item><item name="text_list_bg">@style/text_list_bg_default</item><item name="text_list">@style/text_list_default</item><item name="customCheckBox">@style/customCheckBox_default</item><item name="text_nettraffic_title">@style/text_nettraffic_title_default</item><item name="bg_nettraffic_title">@style/bg_nettraffic_title_default</item><item name="text_nettraffic_content">@style/text_nettraffic_content_default</item><item name="bg_base_nettraffic">@style/bg_base_nettraffic_default</item><item name="write_btn_textColor">@style/write_btn_textColor_default</item><item name="reply_btn_textColor">@style/reply_btn_textColor_default</item><item name="write_antline">@style/write_antline_default</item><item name="tabbar_bg">@style/tabbar_bg_default</item><item name="progress_drawable">@style/progress_drawable_default</item><item name="scrollbar_drawable">@style/scroll_bar_default</item><item name="reply_edit_box">@style/reply_edit_box_default</item><item name="imput_bottom_style">@style/imput_bottom_style_default</item><item name="app_titlebar_text">@style/app_titlebar_text_default</item><item name="checkin_line_color">@style/checkin_line_color_default</item><item name="checkin_line_up_select_color">@style/checkin_line_up_select_color_default</item><item name="checkin_line_up_unselect_color">@style/checkin_line_up_unselect_color_default</item><item name="checkin_line_down_color">@style/checkin_line_down_color_default</item><item name="myfeed_entry_bg">@style/d_button_entry_bg_default</item><item name="recordgift_background">@style/recordgift_background_style_default</item><item name="batch_loadup_button_bg">@style/batch_loadup_button_bg_default</item><item name="bubble_bg_color">#ff88cbf9</item><item name="text_more_color">#ff404040</item><item name="mini_cert_text_color">#ffaaaaaa</item><item name="checkin_title_select_bg_color">#fff4f4f4</item><item name="checkin_title_unselect_bg_color">#ffe9f5fc</item><item name="checkin_title_select_text_color">#ff000000</item><item name="checkin_title_unselect_text_color">#ff3b8ed4</item><item name="tips_bg_color">#ffffffff</item><item name="colorimage_speech_searchfriend_virtualframe">#ffb9d6e7</item><item name="colorimage_tab_color">#ff6dbaf7</item><item name="colorimage_white_tab_color">#ffffffff</item><item name="colorimage_bg_color">#ffffffff</item><item name="colorimage_feed_down_up">#ff3789cb</item><item name="colorimage_bg_color_for_watermark">#ffffffff</item><item name="colorimage_indicator_bg_color">#ffcdcdcd</item><item name="colorimage_srcover_bg_color">#00ffffff</item><item name="colorimage_write_bg_color">#ff757575</item><item name="colorimage_write_sign_color">#ff88cbf9</item><item name="upload_button_cancel">#ffb5d8ee</item><item name="slide_view_dot">@style/slide_view_dot_default</item><item name="colorimage_uploading_bg_color">#ff000000</item><item name="colorimage_right_arrow">#ff9ac9e5</item><item name="colorlinear_bg_color">#ffe6ecef</item><item name="colorbutton_bg_color">#ffffffff</item><item name="colorbutton_disable_select_color">#ff86c7f4</item><item name="colorbutton_text_disable_select_color">#ffbfe5ff</item><item name="colorbutton_write_bg_color">#ff52aae7</item><item name="colorbutton_reply_bg_color">#ffffffff</item><item name="mini_music_bg_color">#ff9acdf5</item><item name="mini_music_bg_color_press">#ffffffff</item><item name="add_msg_bg_color">#ffd2e1ed</item><item name="add_msg_bg_color_press">#ff9cd3fe</item><item name="selected_del_bg_color">#ffcee0ee</item><item name="selected_del_bg_color_press">#ff85b9e3</item><item name="selected_listgo_bg_color">#ff85b9e3</item></style>

其中有大量的自定义属性。下载来的主题当中,含有最这些自定义属性的具体实现。

在Android应用中添加修改主题功能相关推荐

  1. 在Android系统中添加一款新铃声

    想在Android系统中添加铃声,可以通过adb push 的方法,但如果要多次修改系统,每次push进去就显得太费劲了,这里有个简单的方法,就是把铃声编译进android 的system.img文件 ...

  2. 如何在自己开发的android应用中添加广告

    今天看了一篇文章讲的是如何在自己开发的android应用中添加广告的,看完了觉得不是很详细,所以在此我将自己是如何添加广告的步骤总结如下,废话不多,进入主题: 现今流行的手机广告平台很多,每一种平台的 ...

  3. 富文本中添加字体选项功能_扑中的字体功能

    富文本中添加字体选项功能 A little extra help for styling your text 样式设置方面的一些额外帮助 I recently learned about a litt ...

  4. 如何在App中实现朋友圈功能之四在朋友圈中添加发送图片功能——箭扣科技Arrownock

    如何在App中实现朋友圈功能 之四 在朋友圈中添加发送图片功能 实现概念: 当用户在界面点击发送按钮的时候,如果已经有选择好的图片,我们的做法是先上传图片到服务器,再将图片Id作为Post的属性上传. ...

  5. 在verto_communicator中添加呼叫入会功能

    verto_communicator中添加呼叫入会功能 基于FreeSWITCH Version 1.9.0+git~20181001T145919Z~b5624eca20~64bit 一.修改fps ...

  6. OAF在打开的新页面中添加按钮,功能是关闭当前页面

    OAF在打开的新页面中添加按钮,功能是关闭当前页面 javascript:close()

  7. 关于如何正确地在android项目中添加第三方jar包

                  在android项目中添加第三方jar包虽然不是一个很复杂的问题,但是确实给很多开发者带来了不小的困扰.我自己就曾经碰到过calss not found exception ...

  8. Android.mk中添加宏定义

    在Boardconfig.mk 中添加一个 IMAGE_FOR_FACTORY_TEST:= true 由于Boardconfig.mk和各目录的Android.mk是相互关联的 所以我们可以在And ...

  9. python右键弹出菜单编写_python实现应用程序在右键菜单中添加打开方式功能

    最近项目组开发的一个小工具想要在右键菜单中添加打开方式,以有道云笔记为例进行了需求拆解和代码编写 1.需求拆解: 如何实现手动添加右键菜单的打开方式: Step1:打开注册表编辑器,Win+R-> ...

最新文章

  1. python实验总结心得体会_Python,Pyvisa操作Agilent 86140x系列OSA
  2. 如何为JavaScript选择文本编辑器
  3. 什么是ITSS认证,需要多长时间
  4. js进阶正则表达式14验证邮编(input的pattern属性)(正则表达式加起^始$)
  5. 面试高级测试工程师修炼之接口测试平台开发
  6. THREEJS - mousedown/mouseup等鼠标相关事件失效
  7. STM32——库函数版——矩阵按键程序
  8. python爬虫新浪微博评论、评论人信息
  9. 5G推动下,XR的需求“爆发”会来自B端还是C端?...
  10. 哈工大(HIT)计算机网络 翻转课堂 实验 mooc答案 总结
  11. android 8.1 wifi提示“已连接 但无法访问互联网“的解决办法
  12. 车用计算机电路板,使用车充、LED头灯电路板制作1.5V电源模块(可代替1号电池)...
  13. 密码学入门(3):分组密码的模式
  14. texstudio使用
  15. pandownload 服务器在维护,pandownload 2021
  16. 什么叫克隆人_什么叫克隆人?克隆技术有什么好处,快来涨姿
  17. 现在进行时的stem课堂设计
  18. lua函数返回值 lua_call lua_getglobal lua_gettop(L)
  19. Java汽车租赁系统1.2-面向对象+数组
  20. Windows版WPS 2013上线发布

热门文章

  1. java进程通信方式_Java进程间通信方式
  2. 如何清服务器redis缓存信息,redis desktop manager怎么清空缓存?redis desktop manager清空Redis缓存的方法...
  3. java音乐_java实现简单音乐播放器
  4. 嘿嘿,成功加到妹子微信!
  5. 数据库-----数据库操作。
  6. Java位运算符详解(移位、位与、或|、非~、异或^)
  7. vtkImageViewer2实现彩色图与灰度图叠加显示
  8. iOS不能跳转到支付宝的解决办法
  9. MySQL数据库中的索引(含SQL语句)
  10. linux查看有多少内核,linux上查看cpu和内核的个数