Android自定义主题

在设计应用程序时, 你可以使用样式主题来对不同的屏幕和UI 元素进行统一的格式化.

  • 样式是一组格式化属性, 你可以将它作为一个整体作用于布局xml文件中的一个单独的元素. 例如, 你可以定义一个指定某种文字大小和颜色的样式, 然后将它施加于某种类型的View元素.
  • 主题是一组格式化属性, 你可以将它作为一个整体,作用于你的应用程序中的所有activity, 或者某个单独的activity. 例如, 你可以定义一个主题, 指定窗口框和面板的颜色, 菜单的字体和颜色, 然后把它作用于你的程序中的activity.

样式和主题都是资源. android提供了一些默认的样式和主题资源, 你也可以定义你自己的主题和样式资源.

创建样式和主题的步骤如下:

  1. 创建一个名为styles.xml的文件在你的程序的res/values目录下. 增加一个根<resources>节点.
  2. 对每一种样式或主题, 增加一个<style>元素, 该元素有一个唯一的名字, 有一个可选的parent属性. 名字用于引用这些样式, 而parent属性指定它们继承什么样式资源.
  3. 在<style> 元素中, 使用<item>元素定义格式属性. 每个<item>使用名字属性来指定属性, 并在该元素中定义该属性的值.
  4. 可 以从其它xml资源, manifest或者应用程序代码中引用这些资源.

Styles 样式

这里是一个样式的例子:


<?xml version="1.0" encoding="utf-8"?>
<resources>
    
<style name="SpecialText" parent="@style/Text">
        
<item name="android:textSize">18sp</item>
        
<item name="android:textColor">#008</item>
    
</style>
</resources>

如上所 示, 你可以使用<item>元素来设定特定的格式属性. item中的name属性可以指示一个标准的字符串, 一个16进制颜色, 或者引用其它的资源类型.

注意到<style>元素中的parent属性. 该属性让你指定一个资源, 你的当前样式继承于该资源. 样式可以继承任何包含你想要的样式的资源. 一般来说, 你的样式应该总是继承于一个标准的android样式资源. 这样, 你只需要定义你想要改变的部分就可以了.

这里是如何在xml布局中使用样式:


<EditText id="@+id/text1"
          
style="@style/SpecialText"
          
android:layout_width="fill_parent"
          
android:layout_height="wrap_content"
          
android:text="Hello, World!" />

现在这个EditText widget 将被使用之前定义的样式.

Themes 主题

就像样 式一样, 主题也是使用xml <style>元素来定义的, 而且也是使用相同方式来引用的. 不同之处是你将一个主题添加到整个程序或者activity, 通过manifest中的<application>和<activity>元素. 主题不能作用于单独的View.

这 里是一个主题的例子:


<?xml version="1.0" encoding="utf-8"?>
<resources>
  
<style name="CustomTheme">        
    
<item name="android:windowNoTitle">true</item>
    
<item name="windowFrame">@drawable/screen_frame</item>
    
<item name="windowBackground">@drawable/screen_background_white</item>
    
<item name="panelForegroundColor">#FF000000</item>
    
<item name="panelBackgroundColor">#FFFFFFFF</item>
    
<item name="panelTextColor">?panelForegroundColor</item>
    
<item name="panelTextSize">14</item>
    
<item name="menuItemTextColor">?panelTextColor</item>
    
<item name="menuItemTextSize">?panelTextSize</item>
  
</style>
</resources>

注意@和?符号的用法. "@"表示我们在引用一个其它地方定义的资源(可能是在这个工程内, 也可能是android框架定义的). "?"表示我们在引用一个资源值, 这个值在当前加载的主题中. 这是通过查找一个<item>来实现的.(例如?panelTextColor查 找name="panelTextColor" 的item.)

Set the theme in the manifest 在manifest文件中设置主题

如果要给一个应用程序中给所有的activity设定一个主题, 编辑AndroidManifest文件:

<application android:theme="@style/CustomTheme">

如 果要给某个activity设定一个主题, 将上面的application改为activity即可.

有一些你不 必定义就可以直接用的主题. 例如Dialog主题让你的activity像一个对话框:

<activity android:theme="@android:style/Theme.Dialog">

如果你喜欢某个主题, 但希望能调整一些地方, 那么就将该主题设为你的自定主题的parent.例如, 我们希望调整Theme.Dialog主题:

<style name="CustomDialogTheme" parent="@android:style/Theme.Dialog">

Set the theme from the application 在程序中设置主题

你也可以在程序中使用setTheme()方法加载一个主题. 主题, 你必须首先设置主题, 然后才能初始化View对象, 例如, 在调用 setContentView(View) 或者 inflate(int, ViewGroup)之前. 这样才能保证你对你所有的UI屏幕使用了同样的主题. 例如:


 protected void onCreate(Bundle savedInstanceState) {
    
super.onCreate(savedInstanceState);
    
...
    setTheme
(android.R.style.Theme_Light);
    setContentView
(R.layout.linear_layout_3);
}

如 果你希望在程序中加载一个主题, 注意该主题不会在系统启动activity的动画中加载, 因为这个动画是在你的程序启动之前发生的. 大部分情况下, 在xml里面设置主题是一个更好的方法.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值