wen742538485 发表于 2013-1-14 18:01:55

在Android中定义自己的Style

统一的用户界面是可以使得应用程序更友好。要做到用户界面的统一,我们就必须用到风格(style)和主题(theme)。Android系统提供了很多系统默认的Style和Theme,但是很多情况下,这些不能满足我们的需要。例如我们不可能总是希望背景色是系统规定的,我们也不希望字体大小一成不变。当然我们可以在每个空间里面进行修改,但是如果放到风格里面去做,可以更容易的做到用户界面统一,而且更方便修改。如果有读者还不了解风格和主题,你可以在Andoird的Dev Guide文档里面找到详细的解释。
在这篇文章中,我们用一个简单的例子来逐步展示如何定制风格。主要用到一个定制的类TextView。我们通过修改设定TestView的风格,让你进一步的了解如何定制风格的。
(一)简单定制及应用风格
      开发者在查询Android的Dev Guide文档时,可能已经发现文档介绍了一种简单的风格定制。这种简单的风格定制,可以满足很多用户的需要。比如你仅仅希望修改View的背景颜色,或者字体大小等。你所能修改的所有条目(item)都是系统已经定义过的,开发者可以改变条目的值,来达到不同的效果。示例一就是这样一个简单定制。在values目录下创建styles.xml,然后把风格的名字定义为Widget.TestView。设置背景颜色为白色。
1.   <resources>   
2.         <style name="Widget.TestView" parent="android:Widget">   
3.             <item name="android:background">#FFFFFFFF</item>   
4.         </style>   
5.   </resources>
示例一
      示例一展示了如何定制风格,要把定制的风格应用到示例中的TestView,还需要对layout/testtheme.xml文件中的TestView指定这个风格。做完这个步骤,然后运行示例程序就可以看到白色背景效果。示例二中, 你可以看到语句style="@style/Widget.TestView",就是起这个作用的。
1.   <com.android.mytest.TestView   
2.         style="@style/Widget.TestView"
3.         android:layout_width="wrap_content"
4.   android:layout_height="wrap_content"/>

示例二
(二)定制风格条目
      如果开发者想要进一步开发,他可能发现仅仅继承并修改系统定义好的条目不能满足他的需要。比如开发者想让定制的TestView上可以显示一个带颜色的圆圈,显然系统定义的条目没有关于圆圈的信息。那怎么来实现? 用前面介绍的简单定制就不能满足开发者的需要了。
      简单起见,这里我们假设TestView需要了解到圆圈的颜色和半径就可以绘制一个圆圈。可能有人会异议说,我们在TestView的代码里面直接写上不就可以了嘛,实现起来是没有问题。但是一旦用户修改就必须得修改代码,就有可能出错。 如果我们把这些信息可以放到自己定制的风格里面,就简单多了。 如果用户想修改颜色或者大小,只需要修改定义风格xml文件的信息,不需要修改代码。
      好了,决定要添加圆圈信息了,首先在styles.xml里面,添加circleColor和circleRadius两个条目,并设置他们相应的值, 示例三展示了如何添加这两个条目。是不是这样就万事大吉了那?如果你现在去编译,肯定会得到这两个条目不存在的错误信息。为什么呢? 我们试想一下,系统没有定义这两个条目,仅仅使用了它们,当然不知道两个条目是什么东西了。
      如果要让系统知道有这两个条目,我们首先要定义它们。在values目录下创建一个attrs.xml文件。然后添加圆圈的半径和颜色。 在attrs.xml里面可以定义很多类型的条目(item),例如integer、float、color、 reference、string、dimension等。在这里只定义了两种一个是用color来定义颜色,一种是用float来定义半径。这些类型信息告诉Android的资源(Resource)系统如何去解读这些字段, 具体参看示例四。
1.   <resources>   
2.         <style name="Widget.TestView" parent="android:Widget">   
3.         <item name="android:background">#FFFFFFFF</item>   
4.         <item name="circleColor">#FFFF0000</item>   
5.         <item name="circleRadius">60sp</item>   
6.         </style>   
7.   </resources>
示例三

1.   <resources>   
2.         <!-- These are the attributes that make up customized theme. -->   
3.      
4.         <declare-styleable name="TestView">   
5.             <!-- Default TestView style. -->   
6.             <attr name="testViewStyle" format="reference" />   
7.      
8.             <!-- Color to use for the background of the Circle -->   
9.             <attr name="circleColor" format="color" />   
10.   
11.         <attr name="circleRadius" format="float"/>   
12.   </declare-styleable>   
13. </resources>

示例四
      在attrs.xml里面定义完成了,在styles.xml也使用了它们,现在你去编译就不会有错了。问题是,怎么让TestView知道这些信息。这两个条目是我们自己定义的,所以我们也得自己去添加一些代码让TestView了解到这些信息。以下的示例五,展示了怎么从资源总找到我们添加进去的两个条目的值。
1.   public TestView(Context context, AttributeSet attrs, int defStyle) {   
2.               super(context, attrs, defStyle);   
3.      
4.               TypedArray a =   
5.                     context.obtainStyledAttributes(   
6.                         attrs, R.styleable.TestView, defStyle, 0);   
7.      
8.               int n = a.getIndexCount();   
9.                  
10.             for (int i = 0; i < n; i++) {   
11.               int attr = a.getIndex(i);   
12.   
13.               switch (attr) {   
14.               case R.styleable.TestView_circleColor:   
15.                     mCircleColor = a.getColor(attr, Color.RED);   
16.                     break;   
17.               case R.styleable.TestView_circleRadius:   
18.                     mCircleRadius = a.getFloat(attr, 40f);   
19.                     break;   
20.               }   
21.   
22.             }   
23.         }

示例五
      TestView获取到圆圈的颜色和半径信息后,就可以用这些信息去画开发者想要的圆圈了。

(三)设置默认风格
    在第一部份讲到,如果开发者想要应用你所定制的风格给你定制的TestView,开发者用style="@style/Widget.TestView"这种方式。如果开发者在他的应用里就用了一次TestView,我想这也没什么大不了的。但是如果开发者用到TestView的地方很多,这种方式就有点麻烦了,万一有时候还要修改这个风格,那就更糟糕了。下面是一个简单的方法,就是把你所定制的风格放到一个你自己定制的主题中去。关于创建一个主题,在Android的文档里面已经有了。细心的读者可能发现在示例四中,除了圆圈信息还有另外一个条目(testViewStyle),它的作用就是用在这里。在开发这定制的主题中,把这个条目的值设置为我们定制的风格(示例六),还记得风格的名字叫:Widget.TestView 吧?现在我们所定制的风格就是对这个TestView的默认风格了。

1.   <resources>   
2.         <style name="Theme.OMS" parent="android:Theme">   
3.             <item name="testViewStyle">@style/Widget.TestView</item>   
4.         </style>   
5.         
6.   </resources>

示例六
      然后就是应用所定制的主题到设计的应用,简单的一点的方式就是在AndroidManifest.xml中添加语句 android:theme="@style/Theme.OMS">。现在你就可以看到你所定制的风格的效果了
页: [1]
查看完整版本: 在Android中定义自己的Style