Android利用注解转换字段的尺寸类型

在类里写的尺寸值默认是px的,这样在做不同屏幕适配的时候十分不方便

所以一般都利用

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>}
这样就能达到我想要的效果咯 哈哈 虽然说性能上还是有些影响的 但是代码看着很规整



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,使用注解可以很方便地实现字段转换和忽略大小写的功能。具体实现如下: 1. 定义注解类ExcelField,用于标记需要转换字段。 ``` @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface ExcelField { String value() default ""; } ``` 2. 在需要转换字段上添加ExcelField注解,并指定转换后的字段名。 ``` public class User { @ExcelField("用户名") private String username; @ExcelField("邮箱") private String email; //... } ``` 3. 定义一个工具类ExcelUtil,用于读取Excel文件并转换成对象列表。 ``` public class ExcelUtil { public static <T> List<T> readExcel(String filePath, Class<T> clazz) throws Exception { List<T> list = new ArrayList<>(); Workbook workbook = WorkbookFactory.create(new File(filePath)); Sheet sheet = workbook.getSheetAt(0); List<String> headers = getHeader(sheet.getRow(0)); for (int i = 1; i <= sheet.getLastRowNum(); i++) { Row row = sheet.getRow(i); T obj = clazz.newInstance(); for (int j = 0; j < headers.size(); j++) { String header = headers.get(j); Cell cell = row.getCell(j); Field field = getField(clazz, header); if (field != null && cell != null) { field.setAccessible(true); field.set(obj, convertValue(field.getType(), cell.getStringCellValue())); } } list.add(obj); } return list; } private static List<String> getHeader(Row row) { List<String> headers = new ArrayList<>(); for (int i = 0; i < row.getLastCellNum(); i++) { Cell cell = row.getCell(i); if (cell != null) { headers.add(cell.getStringCellValue()); } } return headers; } private static Field getField(Class<?> clazz, String header) { for (Field field : clazz.getDeclaredFields()) { if (field.isAnnotationPresent(ExcelField.class)) { ExcelField excelField = field.getAnnotation(ExcelField.class); if (excelField.value().equalsIgnoreCase(header)) { return field; } } else if (field.getName().equalsIgnoreCase(header)) { return field; } } return null; } private static Object convertValue(Class<?> clazz, String value) { if (clazz == String.class) { return value; } else if (clazz == int.class || clazz == Integer.class) { return Integer.parseInt(value); } else if (clazz == double.class || clazz == Double.class) { return Double.parseDouble(value); } else { return value; } } } ``` 4. 使用ExcelUtil读取Excel文件并转换成对象列表。 ``` public static void main(String[] args) throws Exception { List<User> users = ExcelUtil.readExcel("user.xlsx", User.class); for (User user : users) { System.out.println(user.getUsername() + "," + user.getEmail()); } } ``` 这样就可以实现对Excel文件中的字段进行转换,并且忽略大小写了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值