使用dimens.xml解决屏幕适配问题是Android官方解决方案,本文主要讲述了如何自动生成Android屏幕适配的dimens.xml,减少了工作量,在维护dimens.xml文件时更加省时省力。现在整理出来分享给广大的Android程序员兄弟们,希望给他们的开发工作带来帮助。

最近团队再做Android App的屏幕适配,按照官方的办法是layout文件引用dimen变量,  变量放在多个不同分辨率下的dimens.xml文件中,分别放在不同的目录下,

  1. ./app/src/main/res/values-sw480dp-land/dimens.xml
  2. ./app/src/main/res/values-sw600dp-land/dimens.xml
  3. ./app/src/main/res/values-sw720dp-land/dimens.xml
  4. ./app/src/main/res/values-sw800dp-land/dimens.xml
  5. ./app/src/main/res/values-w820dp/dimens.xml

人工处理这些dimens.xml,感觉比较麻烦,就是个体力活,于是做了个工具类按比例自动化生成dimens.xml文件,效率瞬间提高了很多倍,如果需要特殊定义尺寸,放到另一个xml文件里面就行了。

values/dimens.xml 文件示例

  1. <resources>
  2.  
  3. <!-- Default screen margins, per the Android Design guidelines. -->
  4. <dimen name="activity_horizontal_margin">14dp</dimen>
  5. <dimen name="activity_vertical_margin">14dp</dimen>
  6.  
  7. <dimen name="action_bar_height">50dp</dimen>
  8. <dimen name="tab_height">81dp</dimen>
  9. <dimen name="content_margin">18dp</dimen>
  10. <dimen name="list_title_height">63dp</dimen>
  11.  
  12. <dimen name="report_table_header_height">54dp</dimen>
  13. <dimen name="report_category_height">54dp</dimen>
  14.  
  15. <dimen name="fab_size_normal">72dp</dimen>
  16. <dimen name="fab_margin">14dp</dimen>

工具类代码,直接运行即可

  1. import java.io.BufferedReader;
  2. import java.io.BufferedWriter;
  3. import java.io.File;
  4. import java.io.FileReader;
  5. import java.io.FileWriter;
  6. import java.io.IOException;
  7. import java.io.PrintWriter;
  8.  
  9. /**
  10. * 根据values/dimens.xml, 自动计算比例并生成不同分辨率的dimens.xml
  11. * 注意用dp和sp,不要用dip,否则生成可能会出错;xml值不要有空格
  12. * Created by zhangxitao on 15/9/22.
  13. */
  14. public class DimenTool {
  15.  
  16. public static void gen() {
  17.  
  18. File file = new File("./app/src/main/res/values/dimens.xml");
  19. BufferedReader reader = null;
  20. StringBuilder sw480 = new StringBuilder();
  21. StringBuilder sw600 = new StringBuilder();
  22. StringBuilder sw720 = new StringBuilder();
  23. StringBuilder sw800 = new StringBuilder();
  24. StringBuilder w820 = new StringBuilder();
  25.  
  26. try {
  27. System.out.println("生成不同分辨率:");
  28. reader = new BufferedReader(new FileReader(file));
  29. String tempString;
  30. int line = 1;
  31. // 一次读入一行,直到读入null为文件结束
  32.  
  33. while ((tempString = reader.readLine()) != null) {
  34.  
  35. if (tempString.contains("</dimen>")) {
  36. //tempString = tempString.replaceAll(" ", "");
  37. String start = tempString.substring(0, tempString.indexOf(">") + 1);
  38. String end = tempString.substring(tempString.lastIndexOf("<") - 2);
  39. int num = Integer.valueOf(tempString.substring(tempString.indexOf(">") + 1, tempString.indexOf("</dimen>") - 2));
  40.  
  41. sw480.append(start).append((int) Math.round(num * 0.6)).append(end).append("/n");
  42. sw600.append(start).append((int) Math.round(num * 0.75)).append(end).append("/n");
  43. sw720.append(start).append((int) Math.round(num * 0.9)).append(end).append("/n");
  44. sw800.append(tempString).append("/n");
  45. w820.append(tempString).append("/n");
  46.  
  47. } else {
  48. sw480.append(tempString).append("/n");
  49. sw600.append(tempString).append("/n");
  50. sw720.append(tempString).append("/n");
  51. sw800.append(tempString).append("/n");
  52. w820.append(tempString).append("/n");
  53. }
  54. line++;
  55. }
  56. reader.close();
  57. System.out.println("<!-- sw480 -->");
  58. System.out.println(sw480);
  59. System.out.println("<!-- sw600 -->");
  60. System.out.println(sw600);
  61.  
  62. System.out.println("<!-- sw720 -->");
  63. System.out.println(sw720);
  64. System.out.println("<!-- sw800 -->");
  65. System.out.println(sw800);
  66.  
  67. String sw480file = "./app/src/main/res/values-sw480dp-land/dimens.xml";
  68. String sw600file = "./app/src/main/res/values-sw600dp-land/dimens.xml";
  69. String sw720file = "./app/src/main/res/values-sw720dp-land/dimens.xml";
  70. String sw800file = "./app/src/main/res/values-sw800dp-land/dimens.xml";
  71. String w820file = "./app/src/main/res/values-w820dp/dimens.xml";
  72. writeFile(sw480file, sw480.toString());
  73. writeFile(sw600file, sw600.toString());
  74. writeFile(sw720file, sw720.toString());
  75. writeFile(sw800file, sw800.toString());
  76. writeFile(w820file, w820.toString());
  77. } catch (IOException e) {
  78. e.printStackTrace();
  79. } finally {
  80. if (reader != null) {
  81. try {
  82. reader.close();
  83. } catch (IOException e1) {
  84. e1.printStackTrace();
  85. }
  86. }
  87. }
  88. }
  89.  
  90. public static void writeFile(String file, String text) {
  91. PrintWriter out = null;
  92. try {
  93. out = new PrintWriter(new BufferedWriter(new FileWriter(file)));
  94. out.println(text);
  95. } catch (IOException e) {
  96. e.printStackTrace();
  97. }
  98.  
  99. out.close();
  100. }
  101.  
  102. public static void main(String[] args) {
  103. gen();
  104. }
  105. }

Android开发——自动生成Android屏幕适配的dimens.xml文件的更多相关文章

  1. android 屏幕适配1 ——dimens.xml的适配

    1.如果是才开始做项目,已经有设计图:720*1280 1).默认values文件夹:1dp=1px values/dimens_x.xml: name: x1~x720   value:1px~72 ...

  2. Qt Create 4.6.2无法自动生成Android Kit

    开发环境: OS,Microsoft Windows [Version 10.0.17134.523] Qt,5.11.1 Qt Creator,4.6.2 JDK,1.8.0_181 Android ...

  3. Android 屏幕适配之dimens适配

    Android 屏幕适配之dimens适配     转  https://blog.csdn.net/github_2011/article/details/72636851 在过去多个项目中一直使用 ...

  4. Android 尺寸单位转换和屏幕适配相关

    Android 尺寸单位转换和屏幕适配相关 各种尺寸单位的意义 dp: Density-independent Pixels 一个抽象的单元,基于屏幕的物理密度. (dp和dip的意义相同,所以不用区 ...

  5. eclipse下Android无法自动生成apk文件怎么办?

    eclipse下Android无法自动生成apk文件怎么办? 现象:创建android工程后,通过手动build/clean或自动build均无法在bin文件夹下生成.apk文件 解决方法:进入win ...

  6. android 开发对gif解码(适配android 4.2、4.3、4.4版本)

    android 开发对gif解码(适配android 4.2.4.3.4.4版本) 使用方法: public class ImageInputActivity extends Activity imp ...

  7. Android AIDL自动生成Java文件测试

    /******************************************************************************** * Android AIDL自动生成 ...

  8. [译]:Xamarin.Android开发入门——Hello,Android深入理解

    返回索引目录 原文链接:Hello, Android_DeepDive. 译文链接:Xamarin.Android开发入门--Hello,Android深入理解 本部分介绍利用Xamarin开发And ...

  9. Android开发自学笔记(Android Studio1.3.1)—3.Android应用结构解析

    一.R文件是什么?      如上图所示,我们可以通过findViewById方法通过传入R.id.show找到我们的TextView元素,findViewById方法也很好理解,从View中通过Id ...

随机推荐

  1. 新LNMP环境,但是SESSION跨页面或者刷新 session丢失

    唠叨:本地WAMP做了一个微信项目,一切OK,昨天需要在LINUX架设一套LNMP环境.但是,在架设代码的时候,登录总是不成功~~~ 最终解决:权限 其实,作为一个程序猿,只要涉及到服务器内容,都应该 ...

  2. [PHP] - 逗号和点号的区别

    比如:1. echo 'abc'.'def'; //用点号连接字符串 2. echo 'abc','def'; //用逗号连接字符串 也许很多人都知道逗号要比点号快.但是不知道为什么.更不知道这两者到 ...

  3. Unable to execute dex: Multiple dex files define异常的解决办法

    问题: [2016-01-06 16:47:58 - Dex Loader] Unable to execute dex: Multiple dex files define Landroid/sup ...

  4. 信息学院第九届ACM程序设计竞赛题解

     A: 信号与系统 Time Limit: 1000 MS Memory Limit: 65536 KBTotal Submit: 238 Accepted: 44 Page View: 69 Des ...

  5. 几款JS地图插件比较

    因工作需要,最近研究几款关于地图的JS插件,现与大家分享一下. 以下比较只是浅层次的分析一下,并没有实际通过项目检验,所以不足之处还请大家指出. 地图插件对比 插件名  简介 区域支持 扩展性 离线支 ...

  6. 【Java基础之容器】Iterator

    Iterator: ->所有实现了Collection接口的容器类都有一个iterator方法用以返回一个实现了Iterator接口的对象 ->Iterator对象称作迭代器,用以方便的实 ...

  7. 【转】Android项目中编译 C的模块

    原文网址:http://blog.csdn.net/Harrison_zhu/article/details/4057738 Android编译环境本身比较复杂,且不像普通的编译环境:只有顶层目录下才 ...

  8. Ruby基础类型,动态特性,代码块

    #Ruby内置基础数据类型 NilClass,TureClass,FalseClass,Time,Date,String,Range,Struct,Array,Hash #Numerice 1.分为I ...

  9. Maven使用教程

    一.Maven介绍 我们在开发项目的过程中,会使用一些开源框架.第三方的工具等等,这些都是以jar包的方式被项目所引用,并且有些jar包还会依赖其他的jar包,我们同样需要添加到项目中,所有这些相关的 ...

  10. Owasp Top 10 Security Risks for 2014

    A1-互联网泄密事件/撞库攻击 以大量的用户数据为基础,利用用户相同的注册习惯(相同的用户名和密码),尝试登陆其它的网站.2011年,互联网泄密事件引爆了整个信息安全 界,导致传统的用户+密码认证的方 ...