Android的一个BindView工具的实现

原创 2016年08月06日 21:18:50

对于Android已经有很多Bind View的工具了,大多都是使用了反射和注解的方法。那么如何实现一个简易的代码生成工具呢?其实不难,只要会写代码都可以试试。这些天,我试了一下,并将它做成了工具。代码如下:

package com.example;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by owant on 2016/8/4.
 */
public class BindViewTool {

    public static String xmlPath = "F:\\MyWorkAS\\NewHome\\app\\src\\main\\res\\layout\\activity_main.xml";
    //第一个是类型,第二个是名字
    public static String formatValue = "private {0} {1};";
    //第一个是变量,第二是类型,第三个是ID
    public static String formatBind = "{0}=({1})findViewById(R.id.{2});";

    public static void main(String[] arg) {
        //读取文件
        try {

            String path="";
            path=arg[0];
            if(path.length()<0){
                System.out.println("请输入文件路径");
                return;
            }

            BufferedReader bufferedReader = new BufferedReader(new FileReader(new File(path)));

            StringBuffer context = new StringBuffer();
            String line;
            String startLine = "";
            String endLine = "";

            while ((line = bufferedReader.readLine()) != null) {
                if (line.trim().length() > 0) {
                    //进入<
                    if (line.trim().startsWith("<") && !line.trim().startsWith("</")) {
                        startLine = line.trim();
                    }

                    //如果已经进入了<,进行查找Id
                    if (startLine.length() > 0) {
                        if (line.indexOf("android:id=\"@+id/") > 0) {
                            endLine = line.trim();
                            context.append(startLine.trim()).append("&&");
                            context.append(endLine.trim()).append("&&");

                            startLine = "";
                            endLine = "";
                        }
                    }
                }
            }

            String contextValue = context.toString();

            contextValue = contextValue.substring(0, contextValue.length() - "&&".length());

            String[] splits = contextValue.split("&&");

            int length = splits.length;
            List<String> variables = new ArrayList<String>();
            List<String> binds = new ArrayList<String>();

            for (int i = 0; i < length; i = i + 2) {
                String type = splits[i].replace("<", "");

                if (type.lastIndexOf(".") > 0) {
                    type = type.substring(type.lastIndexOf(".")+1, type.length());
                }

                String id = splits[i + 1].substring("android:id=\"@+id/".length(), splits[i + 1].length() - 1);
                // public static String formatValue = "private {0} {1}";
                String value = formatValue.replace("{0}", type);
                value = value.replace("{1}", id);
                variables.add(value);

                //public static String formatBind = "{0}=({1})findViewById(R.id.{2})";
                String bind = formatBind.replace("{0}", id);
                bind = bind.replace("{1}", type);
                bind = bind.replace("{2}", id);
                binds.add(bind);
            }


            System.out.println();
            System.out.println();

            for (String var : variables) {
                System.out.println(var);
            }

            System.out.println();
            System.out.println();

            for (String b : binds) {
                System.out.println(b);
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

简单分析一下,就是进行一下的判断,就是在AndroidStudio格式化代码后,进行这样的分析:

1.读取文件的一行;
2.如果是”<”开始的进行获取(A);
3.如果是有”android:id=”@+id/”,进行获取(A)
4.之后进行(A)的出来,如果进入”<”并且下一行时”android:id=”@+id/”,那么就是一个Bind View的必要条件
5.之后整理

最后的工具生成后运行效果如下:

对于如何生存jar大家可以参考我的上一篇文章进行操作。
下载路径 http://download.csdn.net/detail/u012131702/9597057

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android注解式绑定控件BindView

转载请注明 出处:http://blog.csdn.net/u012975705/article/details/49637401 Android注解式绑定控件BindView...
  • u012975705
  • u012975705
  • 2015年11月04日 14:20
  • 15375

使用BIND安装智能DNS服务器 添加view和acl配置

转载至:http://www.lxway.com/822698081.htm 智能DNS的配置主要修改named.conf文件,利用view和acl来实现。 acl文件内容,这...
  • aly1989
  • aly1989
  • 2016年04月12日 15:57
  • 1823

还在使用findViewById()?教你如何注解式绑定控件

在android开发中,进行界面渲染的时候,必须先对各种View进行初始化,比如: TextView t = (TextView) findViewById(R.id.x); 这是我们最常见的获取...
  • u012928572
  • u012928572
  • 2014年12月25日 15:43
  • 1623

Android ButterKnife依赖注入框架的引入和使用

俗话说:“不会偷懒的程序员不是好的程序员!”。作为一名Android开发,是不是经常厌烦了大量的findViewById以及setOnClickListener代码,而ButterKnife是一个专注...
  • xiaole0313
  • xiaole0313
  • 2016年12月13日 21:15
  • 906

Butter Knife —— 最好用的View注入

转载请标明出处:http://blog.csdn.net/xx326664162/article/details/52082732 文章出自:薛瑄的博客你也可以查看我的其他同类文章,也会让你有一...
  • xx326664162
  • xx326664162
  • 2016年08月01日 11:07
  • 5418

Android 注解框架----Butter knife

Butter knife的好处: Eliminate findViewById calls by using @BindView on fields.//通过使用@BindView淘汰findVie...
  • laoziyueguo3
  • laoziyueguo3
  • 2016年05月03日 16:20
  • 3069

android:newView()和bindView()

1. http://blog.csdn.net/songjunyan/article/details/38559483 bindView()每个item都会调用,而newView()只有在V...
  • wah001
  • wah001
  • 2017年11月09日 14:56
  • 156

Android @BindView时报Required view ID was not found 异常

最近,在做公司客制化项目的时候遇到一个问题:有些layout下面的xml布局文件需要进行动态的加载,而我使用的是ButterKnife去绑定的view,而且在类的全局变量中已经声明好了,如下所示:@B...
  • zy_style
  • zy_style
  • 2018年01月14日 21:45
  • 92

Android注解式绑定控件,没你想象的那么难

摘要 Android开发中,有一个让人又爱又恨的方法叫findViewById(int);我想如果你是一民Android开发者,必然知道这个方法。 那么为什么让人又爱又恨呢?想必大家也是很有...
  • a956602523
  • a956602523
  • 2016年08月01日 10:58
  • 254

android:newView()和bindView()在什么时候调用

bindView()每个item都会调用,而newView()只有在View convertView参数为空的时候才会调用,具体调用顺序要看你的代码和手机屏幕大小,仔细看下Adapter吧;看这里:h...
  • songjunyan
  • songjunyan
  • 2014年08月14日 15:41
  • 1312
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android的一个BindView工具的实现
举报原因:
原因补充:

(最多只允许输入30个字)