Android项目控件统计(XML标签统计)

最近项目要做改版,需要评估一下工时,因为项目比较大,导致在Studio搜索某些数据的时候数量出现100+的情况(比如统计项目中的Button数量),没办法统计到具体的数据.故写了一个统计xml文件标签的方法(java),分享一下,希望能帮到同样遇到这种问题的童鞋.

需求

修改项目中所有Activity的背景色,字体颜色等,修改所有Button(其他控件)的风格.评估工作量.


分析

看到需求的时候,会不会有童鞋有打开项目一个一个数的想法的(哈哈,其实我也有过,不过一瞬间就被干掉了)?当然这样做也可以,不过就和咸鱼没什么区别了,作为一名程序猿,当然要用程序猿的方式来解决这个问题.

首先分析一下,既然需要评估工作量,就需要知道项目中有多少个Activity和多少个Button(控件).怎么统计呢?
方法其实很多,首先看一下Activity的统计:

方法一)日常开发中一般Activity都是以XxxActivity来命名的,所以可以遍历项目src文件夹,找到所有文件名包含Activity的文件,统计出数量.但是这样统计有没有问题呢?仔细想一下,问题还是挺多的,比如有的Activity文件不是以XxxActivity格式命名的或者说有的非Activity的文件文件名中也包含Activity,这样统计出来的数据就会存在误差.

方法二)每个Activity创建时都需要在AndroidManifest文件中注册之后才能使用,所以打开项目的AndroidManifest文件,看一下有多少个activity标签就可以了.当然在AndroidManifest文件中用Studio中直接搜索就可以看到有多少个activity标签了,这里也用代码实现了一下,两种方式都可以.

在看一下Button(控件)的统计:

因为项目比较大,所以搜到的Button标签的数量很多,Studio里边提示的是100+(当然可能可以在Studio里边设置显示为确切的数据,不过这里没有去具体研究,直接用代码解析的),没办法看到确切的数据.

这里写图片描述

这要怎么解决呢?这里考虑一下,其实Button标签在项目中大都是写在布局文件中的(极少部分代码添加),布局文件都是xml文件,所以这里解析一下xml文件找到Button标签并统计个数其实就可以了,当然项目中有很多布局文件,所以遍历项目中的layout文件夹并统计所有xml文件中的Button标签总个数即可.


具体实现

代码如下:

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

/**
 * @author junweiliu
 * @version 1.0
 * @date 2018/2/28
 * @QQ 1007271386
 */
public class FileRead {

    public static void main(String[] args) {
        // 统计activity数量,当然也可以在IDE中直接查看
        System.out.println("activity的个数是" + labelNum("...你的本地路径/AndroidManifest.xml", "activity"));
        // 统计按钮数量(当然其他控件标签也可)
        try {
            File file = new File("...你的本地路径/layout");
            List<String> resultFileName = new ArrayList<String>();
            List<String> fileNames = new ArrayList<String>();
            fileNames.addAll(getFileNamesForFileFolder(file, resultFileName));
            int buttonNum = 0;
            for (int i = 0; i < fileNames.size(); i++) {
                buttonNum += labelNum(fileNames.get(i), "Button");
            }
            System.out.println("Layout文件个数是" + fileNames.size());
            System.out.println("Button标签个数是" + buttonNum);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * 获取xml文件中某标签个数
     *
     * @param filePath   文件路径
     * @param labelName  标签名称
     * @return
     */
    private static int labelNum(String filePath, String labelName) {
        int count = 0;
        try {
            File f = new File(filePath);
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document doc = builder.parse(f);
            NodeList nl = doc.getElementsByTagName(labelName);
            for (int i = 0; i < nl.getLength(); i++) {
                count++;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return count;
    }

    /**
     * 获取文件夹下所有文件路径
     *
     * @param file            文件夹路径
     * @param resultFileName  文件路径集合  
     * @return
     */
    private static List<String> getFileNamesForFileFolder(File file, List<String> resultFileName) {
        File[] files = file.listFiles();
        if (files == null) return resultFileName;
        for (File f : files) {
            if (f.isDirectory()) {
                resultFileName.add(f.getPath());
                // 调用自身,查找子目录
                getFileNamesForFileFolder(f, resultFileName);
            } else{
                resultFileName.add(f.getPath());
            }
        }
        return resultFileName;
    }
}

运行结果如下:

这里写图片描述


统计的方法有很多,这里只是提供一种思路,其他类型的文件同理.这里使用java来编写,想使用的童鞋可以保存成java文件,修改文件路径及标签名字等信息,使用java指令(1.javac FileRead.java 2.java FileRead)编译运行或者也可放在IDE去运行.当然也可以把方法提出去使用.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值