大量生成dimens.xml
使用方法(windows)
baseFileName =”./res/values-1280x720/dimens.xml”
首先你必须在当前目录下有res文件,里面有values-1280x720文件,底下是dimens.xml。都符合后点击运行。
效果
原来只有一个
运行后:
上代码
package com.sunrui.text;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class Test {
private static String values = "2560,1600;1920,1080;1280,768;1280,720;2560,1440;2560,1536;800,400;960,540;1920,1152;854,480;480,320;1280,800;400,240;854,480;2048,1536;1600,900;960,640;320,240;1920,1200";
private static String dir = "./res";
public static void main(String[] args) {
createFile();
}
private static void writeValue(File file, String width) {
SAXReader saxReader = new SAXReader();
String baseFileName = "./res/values-1280x720/dimens.xml";
try {
Document document = saxReader.read(new File(baseFileName));
Document writeDocument = DocumentHelper.createDocument();
writeDocument.setXMLEncoding("utf-8");
Element root = document.getRootElement();
Element writeRoot = writeDocument.addElement(root.getName());
List<Element> nodes = root.elements();
for (Element child : nodes) {
int value = Integer.parseInt(child.getText().substring(0,
child.getText().length() - 2));
int temp = Integer.parseInt(width);
// int result = (temp * value) / 720;
int result=(temp/720)*value;
Element element = writeRoot.addElement(child.getName());
element.addText(result
+ child.getText().substring(
child.getText().length() - 2));
element.addAttribute("name", child.attributeValue("name"));
FileOutputStream fos;
fos = new FileOutputStream(file);
OutputStreamWriter osw = new OutputStreamWriter(fos, "utf-8");
OutputFormat of = new OutputFormat();
of.setEncoding("utf-8");
of.setIndent(true);
of.setIndent(" ");
of.setNewlines(true);
XMLWriter writer = new XMLWriter(osw, of);
writer.write(writeDocument);
writer.close();
}
} catch (DocumentException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void createFile() {
File file = new File(dir);
if (!file.isFile()) {
file.mkdir();
}
String[] dirs = values.split(";");
for (int i = 0; i < dirs.length; i++) {
String temp[] = dirs[i].split(",");
String fileName = "./res/values-" + temp[0] + "x" + temp[1];
File dir = new File(fileName);
if (!dir.isFile()) {
dir.mkdir();
}
String dimensName = fileName + "/dimens.xml";
File dimens = new File(dimensName);
if (!dimens.isFile()) {
try {
dimens.createNewFile();
writeValue(dimens, temp[1]);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
适配不得不说的事:Values优先级
android对values目录文件的加载顺序有以下几个规则:
1 values(默认)目录下相关类型文件的id定义应是最完整的,即在非默认values目录定义的id都应在默认values目录下相关类型文件中添加同样的定义,否编译不会通过,会报not found id exception
2 系统会根据当前的语言环境加载与语言环境相关的values扩展目录,如没有则加载默认values目录。若存在values扩展目录但类型文件不完整,在读取时若相应类型文件不存在,就会去读取默认values目录下的相关类型文件的id定义
3 若某个id在当前语言环境对应的values目录中找不到定义,会去读取values目录下相关类型文件的值
几个例子让你更加理解:
例子1
当只有这两个文件时候,来了一个手机屏幕为1280*720的用第二个,其他机型用默认第一个。
例子2
values-v11代表在API 11+的设备上,用该目录下的styles.xml代替res/values/styles.xml
values-v14代表在API 14+的设备上,用该目录下的styles.xml代替res/values/styles.xml
所以:
如果api为11(3.0)以下用第一个。
如果api为11(3.0)及以上,4.0以下用v11文件夹
如果api为14(4.0)及以上用v14文件夹