问题描述
style的好处与用法我就不多说了,它可以帮助我们统一定义控件属性,方便设置方便修改,具体描述可以参看官方文档
但是style的编写与应用过程有点麻烦,方法大概可分为两种:
- 先直接在layout中编写View的属性,然后在resource新建一个style,将需要的属性转写为style的item,然后将style设置回layout中,最后移除View中被style覆盖的属性。
优点:过程符合一般直觉。
缺点:整个过程繁琐、机械和重复,而且因为layout与resource语法不同不能直接复制。 - 在resource中直接编写。
优点:避免了重复。
缺点:无法获得部分上下文提示,无法所见即所得。
解决问题
那我们应该如何优雅地解决这个问题呢?使用Android Studio的Refactor功能!
首先在Layout中正常编写View的属性,然后点击右键打开菜单,依次选择Refactor -> Extract -> Style
然后在弹出的Style提取对话框中,选择需要的属性。
最后点击OK,DUANG!style就这样华丽的生成了,而且同时设置到了View中并移除了多余属性。
整个过程简单优雅一气呵成。当我发现这个功能的时候惊喜与懊恼并存,惊喜IDE带给我们的便利,懊恼太晚知道所浪费的时间与精力,所以在这里记录下来让更多的人知道。
之前的野路子
其实文章到这里就该结束了,Android Studio提供的重构功能已经可以完美的解决我们的问题。但其实我是近几天才刚刚发现这个功能的,那我之前是如何面对这个问题的呢?我写了一个简单的Python脚本来完成这个功能,虽然远远比不上重构方便,但是在这里还是记录下自己之前解决问题的过程吧。废话不多说,上脚本。
#!/usr/bin/python
# coding=utf-8
import re
result = []
for line in open("AndroidSource.txt", "r"):
item = re.search('(\S+)="(.+)"', line)
result.append((item.group(1), item.group(2)))
for i in result:
print '<item name="%s">%s</item>' % i
简单说下脚本的目的与思路。
目的:将layout中view的属性自动的转换为resource中style的item的格式。
思路:将view的属性保存到文件中,逐行读取后用正则解析属性名称与属性值,并保存到列表,最后使用item的格式输出到终端。
使用方法:将需要转换的view属性保存到AndroidSource.txt中,运行脚本,最后从终端复制转换结果。
一次典型的运行结果如下,view的四个属性已经转换为style的格式并输出到了终端,复制结果到resource中即可。
/usr/bin/python /Users/dong/PycharmProjects/AndroidBuildScript/AndroidStyle.py
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_marginBottom">@dimen/login_input_margin</item>
<item name="android:layout_marginTop">@dimen/login_input_margin</item>
Process finished with exit code 0