Android多屏适配

大量生成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文件夹

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值