Android利用注解转换字段的尺寸类型
2014-07-05 19:08
260 查看
在类里写的尺寸值默认是px的,这样在做不同屏幕适配的时候十分不方便
所以一般都利用
这种方法把在代码中写的值转换成dp的
但是这不是我想要的效果我希望我代码里面写的是
@PxToDp(px = 10)
int
changdu;
下面是实现:
所以一般都利用
public static int px2dip(Context context, float pxValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (pxValue / scale + 0.5f); }
这种方法把在代码中写的值转换成dp的
但是这不是我想要的效果我希望我代码里面写的是
@PxToDp(px = 10)
int
changdu;
下面是实现:
public class BasicInfoLayout extends ViewGroup{
@Target</span>(ElementType.<span class="s2"><em>FIELD</em></span>)</p><p class="p3"><span class="s3"> </span><strong>public</strong><span class="s3"> </span><strong>@interface</strong><span class="s3"> </span><span class="s1">PxToDp</span><span class="s3"> {</span></p><p class="p1"><span> </span><span> </span><span class="s4"><strong>int</strong></span> px();</p><p class="p1"><span> </span>}</p>
<span style="white-space:pre"></span><p class="p1"><span class="s1"><span style="white-space:pre"> </span>@PxToDp</span></p><p class="p2"><span class="s2"> </span><span class="s3"><strong>int</strong></span><span class="s2"> <strong>width=10;</strong></span></p><p class="p2"><span class="s2"></span></p><p class="p1"><span class="s1"><strong><span style="white-space:pre"> </span>public</strong></span> BasicInfoLayout(Context context, AttributeSet attrs) {</p><p class="p1"><span> </span><span> </span><span class="s1"><strong>super</strong></span>(context, attrs);</p><p class="p1"></p><p class="p1"><span style="white-space:pre"> </span>inject(getResources(), <span class="s1"><strong>this</strong></span>, XKBaseViewGroup.<span class="s1"><strong>class</strong></span>);</p><p class="p1"><span> </span>}</p><p class="p1"><span style="white-space:pre"> </span></p><p class="p1"><span class="s1"><strong><span style="white-space:pre"> </span>public</strong></span> <span class="s1"><strong>void</strong></span> inject(Resources res, View view, Class<?> viewBaseClass) {</p><p class="p1"><span> </span><span> </span><span class="s1"><strong>for</strong></span> (Class<?> clazz = view.getClass(); !viewBaseClass.equals(clazz); clazz = clazz<span style="font-family: Arial, Helvetica, sans-serif;">.getSuperclass()) {</span></p><p class="p1"><span> </span><span> </span><span> </span><span class="s1"><strong>for</strong></span> (Field field : clazz.getDeclaredFields()) {</p><p class="p1"><span> </span><span> </span><span> </span><span> </span>field.setAccessible(<span class="s1"><strong>true</strong></span>);</p><p class="p1"><span> </span><span> </span><span> </span><span> </span>Class<?> fieldType = field.getType();</p><p class="p1"><span> </span><span> </span><span> </span><span> </span>Object value = <span class="s1"><strong>null</strong></span>;</p><p class="p1"><span> </span><span> </span><span> </span><span> </span><span class="s1"><strong>for</strong></span> (Annotation a : field.getAnnotations()) {</p><p class="p3"><span class="s2"><span> </span><span> </span><span> </span><span> </span><span> </span></span><span style="font-family: Arial, Helvetica, sans-serif;"> </span><span class="s1" style="font-family: Arial, Helvetica, sans-serif;"><strong>if</strong></span><span style="font-family: Arial, Helvetica, sans-serif;"> (a </span><span class="s1" style="font-family: Arial, Helvetica, sans-serif;"><strong>instanceof</strong></span><span style="font-family: Arial, Helvetica, sans-serif;"> </span><span class="s3" style="font-family: Arial, Helvetica, sans-serif;">PxToDp</span><span style="font-family: Arial, Helvetica, sans-serif;">) {</span></p><p class="p1"><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span class="s1"><strong>try</strong></span> {</p><p class="p1"><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span>Method m = (Method) view.getClass().getMethod(</p><p class="p1"><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span>field.getName());</p><p class="p1"><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span>Integer val = (Integer) m.invoke(view);</p><p class="p1"><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span>value = val + 1000;</p><p class="p1"><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span>} <span class="s1"><strong>catch</strong></span> (NoSuchMethodException | IllegalAccessException<span style="font-family: Arial, Helvetica, sans-serif;">| IllegalArgumentException</span><span style="font-family: Arial, Helvetica, sans-serif;">| InvocationTargetException e) {</span></p><p class="p1"><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span>e.printStackTrace();</p><p class="p1"><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span>}</p><p class="p1"><span> </span><span> </span><span> </span><span> </span><span> </span>}</p><p class="p1"><span> </span><span> </span><span> </span><span> </span>}</p><p class="p1"><span> </span><span> </span><span> </span><span> </span><span class="s1"><strong>if</strong></span> (value != <span class="s1"><strong>null</strong></span>) {</p><p class="p1"><span> </span><span> </span><span> </span><span> </span><span> </span><span class="s1"><strong>try</strong></span> {</p><p class="p1"><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span>field.set(view, value);</p><p class="p1"><span> </span><span> </span><span> </span><span> </span><span> </span>} <span class="s1"><strong>catch</strong></span> (IllegalAccessException e) {</p><p class="p1"><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span>Log.<em>e</em>(<span class="s4">"XKBaseViewInjecter"</span>, field + <span class="s4">"\n"</span> + value, e);</p><p class="p1"><span> </span><span> </span><span> </span><span> </span><span> </span>} <span class="s1"><strong>catch</strong></span> (IllegalArgumentException e) {</p><p class="p1"><span> </span><span> </span><span> </span><span> </span><span> </span><span> </span>Log.<em>e</em>(<span class="s4">"XKBaseViewInjecter"</span>, field + <span class="s4">"\n"</span> + value, e);</p><p class="p1"><span> </span><span> </span><span> </span><span> </span><span> </span>}</p><p class="p1"><span> </span><span> </span><span> </span><span> </span>}</p><p class="p1"><span> </span><span> </span><span> </span>}</p><p class="p1"><span> </span><span> </span>}</p><p class="p1"><span> </span>}</p>}这样就能达到我想要的效果咯 哈哈 虽然说性能上还是有些影响的 但是代码看着很规整
相关文章推荐
- Android 利用反射和 注解 进行基础类型封装
- 关于linux下C++中利用socket时的数据类型转换错误
- 利用stringstream实现数据类型的转换。
- oracle中blob字段转换成varchar类型
- 用CONVERT函数转换字段类型确保布尔表达式正确运作
- 利用oracle long类型字段,插入大文本
- android学习意外第二季——在类型"R"中创建字段"id"
- 用SQL语句将一字段的ntext数据类型,转换成Nvarchar数据类型,其他类型的方法类似
- 利用C++的stringstream对各种数据类型转换
- android在处理图片资源的时候,进行一些类型的转换
- SQL通过字段类型转换,达类似加密效果
- 在TOMCAT中,以jndi方式操作clob字段时,类型转换异常的对策
- 利用java反射实现Java Bean 类型转换
- 利用C++的stringstream对各种数据类型转换
- 请教:数据库字段类型为datatime,请问在.net里怎样转换为datetime类型来插入数据库?
- 转换CLOB字段类型为VARCHAR2
- 利用oracle long类型字段,插入大文本
- VA利用反射进行数据库的读取免数据类型转换
- "Microsoft Office Access 不能在追加查询中追加所有记录。 Microsoft Office Access设置1字段为Null是因为类型转换失败,它未将0记录添加到表是因为键值冲突,没有添加0记录是因为锁定冲突,没有添加0记录是因为