从布局中快速高效地提取Style

从布局中快速高效地提取Style

问题描述

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
第三种方法

在resources资源文件中先编写View的属性,然后将属性复制到style文件下,通过正则表达式直接替换,将原来的格式直接替换成style中的格式

这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值