• android 切换主题介绍二


    原文出自:Spring sky ,欢迎转载,请保留版权和原文地址 http://blog.csdn.net/springsky_/article/details/24480289  

    在这篇文章前,我写过一篇以apk为插件方式切换主题的文章,那么当你的boss不接受安装方式该怎么办?

    下面,我将要介绍另外一种方式,就是把资源文件打包在主程序的方式,该方式的分析具体如下:

    简介:把主工程中,使用不同的style方式,去加载不同的资源文件(也许听起来很模糊,下面会详细介绍)

    优点:速度快,效率高,不需要额外的安装包,避免的安装、下载等繁琐的问题,不用修改java程序代码,方便,快捷。

    缺点:造成资源包很大,不适合版本控制,每次切换都需要重新OnCreate Activity。

    下面,我们来介绍相关的关键技术:1.自定义我们的attr 对象: 自定义attr,首先需要在values的文件夹中创建一个attrs.xml文件,然后对相关的attr进行配置。这个简单的介绍一下attr的意思,这个是自定义属性的意思,主要用于自定义控件方面,同时我们可以自定义他为皮肤的属性名称.

    具体创建如下:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    
        <attr name="page_bg" format="reference" />
        <attr name="btn_bg" format="reference" />
    
    </resources>

    上面就是我自定义两个属性,一个界面背景和一个按钮背景

    2.定义style主题定义主题这块,目前网上很多文章,都写得很简洁,对于不熟悉的人来说,真心的看不懂,也不提供demo给初学者实践,所以这点很容易让那些意向不坚定的人否决了这种方式,那么具体的应该是:

     

    <?xml version="1.0" encoding="utf-8"?>
    <resources xmlns:android="http://schemas.android.com/apk/res/android">
    
        <style name="Theme.Default" parent="@android:style/Theme.NoTitleBar.Fullscreen">
            <item name="page_bg">@drawable/page_bg</item>
            <item name="btn_bg">@drawable/btn_item_bg</item>
        </style>
        <!-- 夜色朦胧主题 -->
        <style name="Theme.Ysml" parent="@android:style/Theme.NoTitleBar.Fullscreen">
            <item name="page_bg">@drawable/ysml_page_bg</item>
            <item name="btn_bg">@drawable/ysml_btn_item_bg</item>
        </style>
    
    </resources>

    上面我定义了两个主题: Theme.Default是默认主题 Theme.Ysml 是夜色朦胧的主题。

    在两个主题中,有两个item,分辨是page_bg和btn_bg ,其实这里的属性,就是我们在上面定义的attr,这一点,网上的文章没说清楚,导致了很多初学者不理解或者直接到这里就提示错误。所以,笔者特别的提醒一下大家,希望能解决初学者心中的疑惑。

    从page_bg和btn_bg中我都设置了他为我们资源中的两个图片,其实这里可以定义其他的类型,比如:@color @anim 。如果我们需要要做好一个项目,那么就不能按照我这样写了,应该是定义额外的style 来引用,这里就不做具体说明,思维很重要,只要你懂得去简化程序,你就能明白。

    3.怎么使用我们的自定义属性?如下:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="?page_bg"
        android:gravity="center"
        android:orientation="vertical" >
    
        <Button
            android:id="@+id/set_default_theme"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="?btn_bg"
            android:gravity="center"
            android:text="设置为默认主题" />
    
        <Button
            android:id="@+id/set_ys_theme"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="?btn_bg"
            android:gravity="center"
            android:text="设置为夜色主题" />
    
    </LinearLayout>

    在这个layout中,我们的背景中使用了:”?page_bg“,这就是使用图片资源了。当然,当你的属性里面定义的是color,也可以直接调用的,这里就不多做解释,举一反三,多实践吧同学们。

    其实这算是一个隐式的引用关系,因为我们不知道调用哪个主题的资源来显示。那么我们怎么去告诉程序,我要显示哪一个主题?4.调用主题?

    目前有两种使用主题的方式No.1 在AndroidManifest.xml 中配置主题,对一个activity中设置它的:android:theme="" 属性即可,可是,我们是为了动态的调用主题方式,所以这种方式,显然否决了!

    No.2 在Activity中设置,方法:在Activity的onCreate方式中调用:setTheme(theme) 方法,特别注意,该方法必须在调用setContentView之前调用。这里我再额外说两句,如果我们写一个BaseActivity的话,在onCreate中调用一下setTheme方法,那么是不是会简化我们的代码?吐舌头


    那么具体,就看看我们运行的效果:1.默认主题:


    2.夜色朦胧主题:


     

    总结:总体来说,该方式应该在很多公司容易接受,但是优缺点我也说了,可能每个人的想法不一致,呵呵,主要的是我们能熟悉懂得技术,需要的时候我们立马解决问题就ok,对自己的提升也是一个不错的实践。如有疑问请联系我。


    具体代码:http://download.csdn.net/detail/vipa1888/7252141


     


  • 相关阅读:
    using关键字的使用
    浅谈重写、重载、继承、多态
    ASP.NET控件之Content控件
    CommandArgument用法
    sql语句导入导出大全
    常用正则表达式
    做饭71技巧
    SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员
    如何成为一个技术“牛人”
    Yahoo! Media Player 将播放器放在自己网站上
  • 原文地址:https://www.cnblogs.com/springskyhome/p/3689906.html
Copyright © 2020-2023  润新知