跟java.lang这个包的作用类似,Commons Lang这一组API也是提供一些基础的、通用的操作和处理,如自动生成toString()的结果、自动实现hashCode()和equals()方法、数组操作、枚举、日期和时间的处理等等。这一组API的所有包名都以org.apache.commons.lang开头,共有如下8个包:org.apache.commons.langorg.apache.commons.lang.builderorg.apache.commons.lang.enumorg.apache.commons.lang.enumsorg.apache.commons.lang.exceptionorg.apache.commons.lang.mathorg.apache.commons.lang.mutableorg.apache.commons.lang.time        其中的lang.enum已不建议使用,替代它的是紧随其后的lang.enums包。 lang包主要是一些可以高度重用的Util类;lang.builder包包含了一组用于产生每个Java类中都常使用到的toString()、 hashCode()、equals()、compareTo()等等方法的构造器;lang.enums包顾名思义用于处理枚 举;lang.exception包用于处理Java标准API中的exception,为1.4之前版本提供Nested Exception功能;lang.math包用于处理数字;lang.mutable用于包装值型变量;lang.time包提供处理日期和时间的功 能。        由于Commons的包和类实在很多,不可能一个一个讲了,在接下来的专题文章中我就只分别过一下lang、lang.builder、lang.math和lang.time这几个包和常见的用法,其他的我们可以在用到时临时参考一下Javadoc。位置就在安装路径的…\commons-lang-2.1\docs\api\index.html        我们首先来看org.apache.commons.lang包,这个包提供了一些有用的包含static方法的Util类。除了6个Exception类和2个已经deprecated的数字类之外,commons.lang包共包含了17个实用的类:ArrayUtils – 用于对数组的操作,如添加、查找、删除、子数组、倒序、元素类型转换等;BitField – 用于操作位元,提供了一些方便而安全的方法;BooleanUtils – 用于操作和转换boolean或者Boolean及相应的数组;CharEncoding – 包含了Java环境支持的字符编码,提供是否支持某种编码的判断;CharRange – 用于设定字符范围并做相应检查;CharSet – 用于设定一组字符作为范围并做相应检查;CharSetUtils – 用于操作CharSet;CharUtils – 用于操作char值和Character对象;ClassUtils – 用于对Java类的操作,不使用反射;ObjectUtils – 用于操作Java对象,提供null安全的访问和其他一些功能;RandomStringUtils – 用于生成随机的字符串;SerializationUtils – 用于处理对象序列化,提供比一般Java序列化更高级的处理能力;StringEscapeUtils – 用于正确处理转义字符,产生正确的Java、JavaScript、HTML、XML和SQL代码;StringUtils – 处理String的核心类,提供了相当多的功能;SystemUtils – 在java.lang.System基础上提供更方便的访问,如用户路径、Java版本、时区、操作系统等判断;Validate – 提供验证的操作,有点类似assert断言;WordUtils – 用于处理单词大小写、换行等。下面讲下最常用的两个类ArrayUtils        数组是我们经常需要使用到的一种数据结构,但是由于Java本身并没有提供很好的API支持,使得很多操作实际上做起来相当繁琐,以至于我们实际编 码中甚至会不惜牺牲性能去使用Collections API,用Collection当然能够很方便的解决我们的问题,但是我们一定要以性能为代价吗?ArrayUtils帮我们解决了处理类似情况的大部分 问题。来看一个例子:view plaincopy to clipboardprint?package sean.study.jakarta.commons.lang; import java.util.Map; import org.apache.commons.lang.ArrayUtils; public class ArrayUtilsUsage { public static void main(String[] args) { // data setup int[] intArray1 = { 2, 4, 8, 16 }; int[][] intArray2 = { { 1, 2 }, { 2, 4 }, { 3, 8 }, { 4, 16 } }; Object[][] notAMap = { { "A", new Double(100) }, { "B", new Double(80) }, { "C", new Double(60) }, { "D", new Double(40) }, { "E", new Double(20) } }; // printing arrays System.out.println("intArray1: " + ArrayUtils.toString(intArray1)); System.out.println("intArray2: " + ArrayUtils.toString(intArray2)); System.out.println("notAMap: " + ArrayUtils.toString(notAMap)); // finding items System.out.println("intArray1 contains '8'? " + ArrayUtils.contains(intArray1, 8)); System.out.println("intArray1 index of '8'? " + ArrayUtils.indexOf(intArray1, 8)); System.out.println("intArray1 last index of '8'? " + ArrayUtils.lastIndexOf(intArray1, 8)); // cloning and resversing int[] intArray3 = ArrayUtils.clone(intArray1); System.out.println("intArray3: " + ArrayUtils.toString(intArray3)); ArrayUtils.reverse(intArray3); System.out.println("intArray3 reversed: " + ArrayUtils.toString(intArray3)); // primitive to Object array Integer[] integerArray1 = ArrayUtils.toObject(intArray1); System.out.println("integerArray1: " + ArrayUtils.toString(integerArray1)); // build Map from two dimensional array Map map = ArrayUtils.toMap(notAMap); Double res = (Double) map.get("C"); System.out.println("get 'C' from map: " + res); } }   以下是运行结果:   intArray1: {2,4,8,16}   intArray2: {{1,2},{2,4},{3,8},{4,16}}   notAMap: {{A,100.0},{B,80.0},{C,60.0},{D,40.0},{E,20.0}}   intArray1 contains '8'? true  intArray1 index of '8'? 2  intArray1 last index of '8'? 2  intArray3: {2,4,8,16}   intArray3 reversed: {16,8,4,2}   integerArray1: {2,4,8,16}   get 'C' from map: 60.0  package sean.study.jakarta.commons.lang;import java.util.Map;import org.apache.commons.lang.ArrayUtils;public class ArrayUtilsUsage { public static void main(String[] args) { // data setup int[] intArray1 = { 2, 4, 8, 16 }; int[][] intArray2 = { { 1, 2 }, { 2, 4 }, { 3, 8 }, { 4, 16 } }; Object[][] notAMap = { { "A", new Double(100) }, { "B", new Double(80) }, { "C", new Double(60) }, { "D", new Double(40) }, { "E", new Double(20) } }; // printing arrays System.out.println("intArray1: " + ArrayUtils.toString(intArray1)); System.out.println("intArray2: " + ArrayUtils.toString(intArray2)); System.out.println("notAMap: " + ArrayUtils.toString(notAMap)); // finding items System.out.println("intArray1 contains '8'? " + ArrayUtils.contains(intArray1, 8)); System.out.println("intArray1 index of '8'? " + ArrayUtils.indexOf(intArray1, 8)); System.out.println("intArray1 last index of '8'? " + ArrayUtils.lastIndexOf(intArray1, 8)); // cloning and resversing int[] intArray3 = ArrayUtils.clone(intArray1); System.out.println("intArray3: " + ArrayUtils.toString(intArray3)); ArrayUtils.reverse(intArray3); System.out.println("intArray3 reversed: " + ArrayUtils.toString(intArray3)); // primitive to Object array Integer[] integerArray1 = ArrayUtils.toObject(intArray1); System.out.println("integerArray1: " + ArrayUtils.toString(integerArray1)); // build Map from two dimensional array Map map = ArrayUtils.toMap(notAMap); Double res = (Double) map.get("C"); System.out.println("get 'C' from map: " + res); }}以下是运行结果:intArray1: {2,4,8,16}intArray2: {{1,2},{2,4},{3,8},{4,16}}notAMap: {{A,100.0},{B,80.0},{C,60.0},{D,40.0},{E,20.0}}intArray1 contains '8'? trueintArray1 index of '8'? 2intArray1 last index of '8'? 2intArray3: {2,4,8,16}intArray3 reversed: {16,8,4,2}integerArray1: {2,4,8,16}get 'C' from map: 60.0        这段代码说明了我们可以如何方便的利用ArrayUtils类帮我们完成数组的打印、查找、克隆、倒序、以及值型/对象数组之间的转换等操作。StringUtils        处理文本对Java应用来说应该算是家常便饭了,在1.4出现之前,Java自身提供的API非常有限,如String、 StringTokenizer、StringBuffer,操作也比较单一。无非就是查找substring、分解、合并等等。到1.4的出现可以说 Java的文字处理上了一个台阶,因为它支持regular expression了。这可是个重量级而方便的东东啊,缺点是太复杂,学习起来有一定难度。相较而言,Jakarta Commons提供的StringUtils和WordUtils至今还维持着那种简洁而强大的美,使用起来也很顺手。来看一个例子:view plaincopy to clipboardprint?package sean.study.jakarta.commons.lang; import org.apache.commons.lang.StringUtils; public class StringUtilsAndWordUtilsUsage { public static void main(String[] args) { // data setup String str1 = ""; String str2 = " "; String str3 = "\t"; String str4 = null; String str5 = "123"; String str6 = "ABCDEFG"; String str7 = "It feels good to use Jakarta Commons.\r\n"; // check for empty strings System.out.println("=============================="); System.out.println("Is str1 blank? " + StringUtils.isBlank(str1)); System.out.println("Is str2 blank? " + StringUtils.isBlank(str2)); System.out.println("Is str3 blank? " + StringUtils.isBlank(str3)); System.out.println("Is str4 blank? " + StringUtils.isBlank(str4)); // check for numerics System.out.println("=============================="); System.out.println("Is str5 numeric? " + StringUtils.isNumeric(str5)); System.out.println("Is str6 numeric? " + StringUtils.isNumeric(str6)); // reverse strings / whole words System.out.println("=============================="); System.out.println("str6: " + str6); System.out.println("str6 reversed: " + StringUtils.reverse(str6)); System.out.println("str7: " + str7); String str8 = StringUtils.chomp(str7); str8 = StringUtils.reverseDelimited(str8, ' '); System.out.println("str7 reversed whole words : \r\n" + str8); // build header (useful to print log messages that are easy to locate) System.out.println("=============================="); System.out.println("print header:"); String padding = StringUtils.repeat("=", 50); String msg = StringUtils.center(" Customised Header ", 50, "%"); Object[] raw = new Object[]{padding, msg, padding}; String header = StringUtils.join(raw, "\r\n"); System.out.println(header); } }         输出的结果如下:   ==============================     Is str1 blank? true    Is str2 blank? true    Is str3 blank? true    Is str4 blank? true    ==============================     Is str5 numeric? true    Is str6 numeric? false    ==============================     str6: ABCDEFG     str6 reversed: GFEDCBA     str7: It feels good to use Jakarta Commons.           str7 reversed whole words :      Commons. Jakarta use to good feels It     ==============================     print header:     ==================================================     %%%%%%%%%%%%%%% Customised Header %%%%%%%%%%%%%%%%     ==================================================  package sean.study.jakarta.commons.lang;import org.apache.commons.lang.StringUtils;public class StringUtilsAndWordUtilsUsage { public static void main(String[] args) { // data setup String str1 = ""; String str2 = " "; String str3 = "\t"; String str4 = null; String str5 = "123"; String str6 = "ABCDEFG"; String str7 = "It feels good to use Jakarta Commons.\r\n"; // check for empty strings System.out.println("=============================="); System.out.println("Is str1 blank? " + StringUtils.isBlank(str1)); System.out.println("Is str2 blank? " + StringUtils.isBlank(str2)); System.out.println("Is str3 blank? " + StringUtils.isBlank(str3)); System.out.println("Is str4 blank? " + StringUtils.isBlank(str4)); // check for numerics System.out.println("=============================="); System.out.println("Is str5 numeric? " + StringUtils.isNumeric(str5)); System.out.println("Is str6 numeric? " + StringUtils.isNumeric(str6)); // reverse strings / whole words System.out.println("=============================="); System.out.println("str6: " + str6); System.out.println("str6 reversed: " + StringUtils.reverse(str6)); System.out.println("str7: " + str7); String str8 = StringUtils.chomp(str7); str8 = StringUtils.reverseDelimited(str8, ' '); System.out.println("str7 reversed whole words : \r\n" + str8); // build header (useful to print log messages that are easy to locate) System.out.println("=============================="); System.out.println("print header:"); String padding = StringUtils.repeat("=", 50); String msg = StringUtils.center(" Customised Header ", 50, "%"); Object[] raw = new Object[]{padding, msg, padding}; String header = StringUtils.join(raw, "\r\n"); System.out.println(header); }}输出的结果如下:==============================Is str1 blank? trueIs str2 blank? trueIs str3 blank? trueIs str4 blank? true==============================Is str5 numeric? trueIs str6 numeric? false==============================str6: ABCDEFGstr6 reversed: GFEDCBAstr7: It feels good to use Jakarta Commons.str7 reversed whole words :Commons. Jakarta use to good feels It==============================print header:==================================================%%%%%%%%%%%%%%% Customised Header %%%%%%%%%%%%%%%%==================================================        从代码中我们可以大致了解到这个StringUtils类简单而强大的处理能力,从检查空串(对null的情况处理很得体),到分割子串,到生成格式化的字符串,使用都很简洁,也很直截了当。总结        以上就是本文的全部内容,希望对大家有所帮助。

Java 基础之修饰符关键词整理我成为一个Java程序员距今已有一段时日。最近,有人问我关于Java修饰符关键字的一个问题,但我根本不知道那是什么。所以我觉得除了实际编程和算法,我也有必要学习这些内容。通过谷歌搜索,我只得到一些琐碎的要点,并不完整。所以我以此主题写了这篇文章。这也是一个可用于测试你的计算机科学知识的面试问题。Java修饰符是你添加到变量、类和方法以改变其含义的关键词。它们可分为两组: 访问控制修饰符 非访问修饰符 让我们先来看看访问控制修饰符,以及如何使用它们的一些代码示例。 修饰符 说明 public 公共可见 private 类可见 protected 包和所有的子类可见 那么如何使用这三种访问控制修饰符呢?请看下面两个类。请忽略此处代码的低效,因为这是教程。创建一个名为project/mypackage/Person.java文件,并添加以下代码:package mypackage;class Person { private String firstname; private String lastname; protected void setFirstname(String firstname) { this.firstname = firstname; } protected void setLastname(String lastname) { this.lastname = lastname; } protected String getFirstname() { return this.firstname; } protected String getLastname() { return this.lastname; }}上面的Person类有private变量和protected方法。这意味着这些变量将只能从类访问,方法将只能从mypackage包访问。接下来创建一个名为project/mypackage/Company.java的文件,并添加以下代码:package mypackage;import java.util.*;public class Company { private ArrayList<Person> people; public Company() { this.people = new ArrayList<Person>(); } public void addPerson(String firstname, String lastname) { Person p = new Person(); p.setFirstname(firstname); p.setLastname(lastname); this.people.add(p); } public void printPeople() { for(int i = 0; i < this.people.size(); i++) { System.out.println(this.people.get(i).getFirstname() + " " + this.people.get(i).getLastname()); } }}上面的类是公共的,因此它可以从包内部和外部的任何类进行访问。它有一个只能在类内访问的私有变量,以及一堆的公共方法。由于Person类和Company类共享相同的包,所以Company类可以访问Person类以及所有它的方法。为了完成访问控制修饰符的示范,让我们在一个新的project/MainDriver.java文件中创建一个驱动程序类:import mypackage.*;public class MainDriver { public static void main(String[] args) { Company c = new Company(); c.addPerson("Nic", "Raboy"); c.printPeople(); Person p = new Person(); p.setFirstname("Maria"); p.setLastname("Campos"); }}请记住,由于Company类是公共的,所以我们在添加和打印人的时候没有问题。然而,由于Person类是受保护的,所以我们会得到一个编译时错误,因为MainDriver不是mypackage包的一部分。现在,让我们来看看现有的非访问修饰符,以及如何使用它们的一些示例代码。 修饰符 说明 static 用于创建类、方法和变量 final 用于最终确定类、变量和方法的实施方式 abstract 用于创建抽象方法和类 synchronized 用于多线程的同步机制对资源进行加锁,使得在同一个时间,只有一个线程可以进行操作 Volatile 一个变量声明为volatile,就意味着这个变量是随时会被其他线程修改的,因此不能将它cache在线程memory中。 那么如何使用这五个非访问修饰符呢?Java中static修饰符的一个很好的例子就是:int max = Integer.MAX_VALUEint numeric = Integer.parseInt("1234");在上面的例子中,请注意我们利用了Integer类中变量和方法,而不是先实例化。这是因为那些特定的方法和变量都是静态的。abstract修饰符则略有不同。你可以创建一个带方法的类,但它们基本只能定义。你不能对它们添加逻辑。例如:abstract class Shape { abstract int getArea(int width, int height);}然后在子类里,你才可以增加例如下面这样的代码:class Rectangle extends Shape { int getArea(int width, int height) { return width * height; }}下面要讲讲synchronized和volatile修饰符。先来看一个线程的例子,在这个例子里我们将从两个不同的线程去访问相同的方法:import java.lang.*;public class ThreadExample { public static void main(String[] args) { Thread thread1 = new Thread(new Runnable() { public void run() { print("THREAD 1"); } }); Thread thread2 = new Thread(new Runnable() { public void run() { print("THREAD 2"); } }); thread1.start(); thread2.start(); } public static void print(String s) { for(int i = 0; i < 5; i++) { System.out.println(s + ": " + i); } }}运行上述代码将输出打印一个随机的顺序。可能是连续的,也可能不连续,取决于CPU。然而,如果我们使用synchronized修饰符,那么第一个线程必须在第二个线程开始打印之前完成。print(String s)方法可以是这样的:public static synchronized void print(String s) { for(int i = 0; i < 5; i++) { System.out.println(s + ": " + i); }}接下来,让我们看看使用volatile 修饰符的例子:import java.lang.*;public class ThreadExample { public static volatile boolean isActive; public static void main(String[] args) { isActive = true; Thread thread1 = new Thread(new Runnable() { public void run() { while(true) { if(isActive) { System.out.println("THREAD 1"); isActive = false; } } } }); Thread thread2 = new Thread(new Runnable() { public void run() { while(true) { if(!isActive) { System.out.println("THREAD 2"); try { Thread.sleep(100); } catch (Exception e) { } isActive = true; } } } }); thread1.start(); thread2.start(); }}由于volatile变量是一种状态标志,所以运行上面的代码会打印线程数,并在它们之间交替。这是因为该标志被存储在主存储器中。如果我们去掉volatile关键字,该线程将只交替一次,因为只使用一个本地参考,两个线程基本上彼此隐身。结论Java修饰符理解起来会有一点棘手,而且实际上很多程序员并不怎么熟悉它们。这是一个很好的面试问题,可以用于测试你的书本知识。最后,如果我有什么遗漏或解释错误的地方,欢迎各位不吝指出。感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

1. 创建自己的bean文件:beans.xml<?xml version="1.0" encoding="UTF-8"?><busi-beans> <beans> <bean id="SysHelloImpl" type="com.cxm.test.SysHello"> <desc>test</desc> <impl-class>com.cxm.test.SysHelloImpl</impl-class> </bean> </beans> </busi-beans>2. 提供解析xml类:XmlUtils/** * */package com.cxm.xmlutil;import java.io.InputStream;import java.util.Iterator;import java.util.Map;import org.jdom.Attribute;import org.jdom.Document;import org.jdom.Element;import org.jdom.input.SAXBuilder;import org.jdom.xpath.XPath;import com.cxm.beaninfo.BeanInfo;/** * @author admin * */public class XmlUtils{ public static void parseXmlDef(InputStream in, Map<String,BeanInfo> beanDefMap, StringBuffer sb) throws Exception { SAXBuilder reader = new SAXBuilder(false); Document doc = null; try { doc = reader.build(in); Iterator beanIt = XPath.selectNodes(doc, "/busi-beans/beans/bean") .iterator(); Element e; BeanInfo beanDef; while (beanIt.hasNext()) { beanDef = new BeanInfo(); e = (Element) beanIt.next(); Attribute attrId = e.getAttribute("id"); Attribute attrType = e.getAttribute("type"); Attribute singleType = e.getAttribute("single"); boolean isSingle = true; if(null != singleType&&"1".equals(singleType.getValue())){ isSingle= false; } beanDef.setSingle(isSingle); beanDef.setBeanId(attrId.getValue()); beanDef.setType(attrType.getValue()); beanDef.setBeanDesc(getText(e, "desc")); beanDef.setImplClassName(getText(e, "impl-class")); //处理初始化参数 beanDefMap.put(attrId.getValue(), beanDef); } } catch (Exception e) { e.printStackTrace(); } } /** * 根据指定的element, xPath获取XML文档内容 * * @param p_element * @param p_xPath * @return * @throws Exception */ public static String getText(Element p_element, String p_xPath) throws Exception { String text = null; Element e=(Element)XPath.selectSingleNode(p_element,p_xPath); if (e != null) { text = e.getText(); } else { } return text; }}3.定义bean IO/** * */package com.cxm.beaninfo;/** * @author admin * */public class BeanInfo{ private String beanId; private String type; private String beanDesc; public String getBeanDesc() { return beanDesc; } public void setBeanDesc(String beanDesc) { this.beanDesc = beanDesc; } public String getType() { return type; } public void setType(String type) { this.type = type; } private String implClassName; public String getBeanId() { return beanId; } public void setBeanId(String beanId) { this.beanId = beanId; } public String getImplClassName() { return implClassName; } public void setImplClassName(String implClassName) { this.implClassName = implClassName; } public boolean isSingle() { return isSingle; } public void setSingle(boolean isSingle) { this.isSingle = isSingle; } private boolean isSingle = true; }4.bean的创建类:BeanUtil/** * */package com.cxm.bean;/** * @author admin * */public class BeanUtil{ private static XmlBeanFactory factory = new XmlBeanFactory(); /** * 获取定义好的Bean对象 * @param p_beanId * @return * @throws Exception */ public static Object createBean(String p_beanId) throws Exception { return factory.createBean(p_beanId); }} /** * */package com.cxm.bean;import java.io.FileNotFoundException;import java.io.InputStream;import java.lang.reflect.Constructor;import java.util.HashMap;import java.util.Map;import com.cxm.beaninfo.BeanInfo;import com.cxm.exception.NoSuchBeanDefinitionException;import com.cxm.xmlutil.XmlUtils;/** * @author admin * */public class XmlBeanFactory{ private static String BEAN_XML = "/beans.xml"; private static Map<String,BeanInfo> beanDefMap = new HashMap<String,BeanInfo>(); private static Map<String,Object> instanceMap = new HashMap<String,Object>(); static { InputStream in = XmlBeanFactory.class.getResourceAsStream(BEAN_XML); if(in ==null){ try{ throw new FileNotFoundException(); }catch (FileNotFoundException e){ e.printStackTrace(); } } StringBuffer sb = new StringBuffer(); try { XmlUtils.parseXmlDef(in, beanDefMap, sb); } catch (Exception e) { throw new RuntimeException(); } } public Object createBean(String beanId) throws Exception{ if(beanId==null || beanId.trim()==""){ throw new Exception("BeanId can not NULL or '' "); } BeanInfo beanInfo = beanDefMap.get(beanId); if(null ==beanInfo ){ throw new NoSuchBeanDefinitionException(" beanid is not define in xml"); } Object instance; if(beanInfo.isSingle()){ instance =instanceMap.get(beanId); if(null != instance){ return instance; } } String implClass = beanInfo.getImplClassName(); Constructor<?> constructor = Class.forName(implClass.trim()).getConstructor(); instance = constructor.newInstance(); if(beanInfo.isSingle()){ instanceMap.put(beanId, instance); } return instance; }}5. 测试:/** * */package com.cxm.test;/** * @author admin * */public interface SysHello{ void sysHello();} /** * */package com.cxm.test;/** * @author admin * */public class SysHelloImpl implements SysHello{ @Override public void sysHello() { System.out.println("hello world!"); } } /** * */package com.cxm.test;import com.cxm.bean.BeanUtil;/** * @author admin * */public class Test{ /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { SysHello s = (SysHello)BeanUtil.createBean("SysHelloImpl"); s.sysHello(); } }以上这篇java实现Spring在XML配置java类的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

实现了一个自定义的密码输入框和自定义数字键盘,用作用户支付密码设置界面。先上效果图如下,方格样式,以及点击空白处隐藏软键盘。 控件实现清单: 1)集成于EditText的输入框控件:PasswordInputView.java2)数字键盘工具类:NumKeyboardUtil.java 3)xml文件:number.xml 4)attrs样式 5)layout文件具体内容: PasswordInputView.javapublic class PasswordInputView extends EditText{ private int textLength; private int borderColor; private float borderWidth; private float borderRadius; private int passwordLength; private int passwordColor; private float passwordWidth; private float passwordRadius; private Paint passwordPaint = new Paint(Paint.ANTI_ALIAS_FLAG); private Paint borderPaint = new Paint(Paint.ANTI_ALIAS_FLAG); private final int defaultSplitLineWidth = 1; public PasswordInputView(Context context, AttributeSet attrs) { super(context, attrs); final Resources res = getResources(); final int defaultBorderColor = res.getColor(R.color.line_color); final float defaultBorderWidth = res.getDimension(R.dimen.dimen_1px); final float defaultBorderRadius = res.getDimension(R.dimen.dimen_6); final int defaultPasswordLength = 6; final int defaultPasswordColor = res.getColor(R.color.normal_text_color); final float defaultPasswordWidth = res.getDimension(R.dimen.dimen_6); final float defaultPasswordRadius = res.getDimension(R.dimen.dimen_6); TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.PasswordInputView, 0, 0); try { borderColor = a.getColor(R.styleable.PasswordInputView_borderColor, defaultBorderColor); borderWidth = a.getDimension(R.styleable.PasswordInputView_borderWidth, defaultBorderWidth); borderRadius = a.getDimension(R.styleable.PasswordInputView_borderRadius, defaultBorderRadius); passwordLength = a.getInt(R.styleable.PasswordInputView_passwordLength, defaultPasswordLength); passwordColor = a.getColor(R.styleable.PasswordInputView_passwordColor, defaultPasswordColor); passwordWidth = a.getDimension(R.styleable.PasswordInputView_passwordWidth, defaultPasswordWidth); passwordRadius = a.getDimension(R.styleable.PasswordInputView_passwordRadius, defaultPasswordRadius); } finally { a.recycle(); } borderPaint.setStrokeWidth(borderWidth); borderPaint.setColor(borderColor); passwordPaint.setStrokeWidth(passwordWidth); passwordPaint.setStyle(Paint.Style.FILL); passwordPaint.setColor(passwordColor); setSingleLine(true); } @Override protected void onDraw(Canvas canvas) { int width = getWidth(); int height = getHeight(); // 分割线 borderPaint.setColor(borderColor); borderPaint.setStrokeWidth(defaultSplitLineWidth); for (int i = 1; i < passwordLength; i++) { float x = width * i / passwordLength; canvas.drawLine(x, 0, x, height, borderPaint); } // 密码 float cx, cy = height/ 2; float half = width / passwordLength / 2; for(int i = 0; i < textLength; i++) { cx = width * i / passwordLength + half; canvas.drawCircle(cx, cy, passwordWidth, passwordPaint); } } @Override protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) { super.onTextChanged(text, start, lengthBefore, lengthAfter); this.textLength = text.toString().length(); invalidate(); } public int getBorderColor() { return borderColor; } public void setBorderColor(int borderColor) { this.borderColor = borderColor; borderPaint.setColor(borderColor); invalidate(); } public float getBorderWidth() { return borderWidth; } public void setBorderWidth(float borderWidth) { this.borderWidth = borderWidth; borderPaint.setStrokeWidth(borderWidth); invalidate(); } public float getBorderRadius() { return borderRadius; } public void setBorderRadius(float borderRadius) { this.borderRadius = borderRadius; invalidate(); } public int getPasswordLength() { return passwordLength; } public void setPasswordLength(int passwordLength) { this.passwordLength = passwordLength; invalidate(); } public int getPasswordColor() { return passwordColor; } public void setPasswordColor(int passwordColor) { this.passwordColor = passwordColor; passwordPaint.setColor(passwordColor); invalidate(); } public float getPasswordWidth() { return passwordWidth; } public void setPasswordWidth(float passwordWidth) { this.passwordWidth = passwordWidth; passwordPaint.setStrokeWidth(passwordWidth); invalidate(); } public float getPasswordRadius() { return passwordRadius; } public void setPasswordRadius(float passwordRadius) { this.passwordRadius = passwordRadius; invalidate(); }}NumKeyboardUtil 数字软键盘工具类public class NumKeyboardUtil { private KeyboardView keyboardView; private Keyboard k;// 数字键盘 private PasswordInputView ed; public NumKeyboardUtil(Activity act, Context ctx, PasswordInputView edit) { this.ed = edit; k = new Keyboard(ctx, R.xml.number); keyboardView = (KeyboardView) act.findViewById(R.id.keyboard_view); keyboardView.setKeyboard(k); keyboardView.setEnabled(true); keyboardView.setPreviewEnabled(true); keyboardView.setOnKeyboardActionListener(listener); } private OnKeyboardActionListener listener = new OnKeyboardActionListener() { @Override public void swipeUp() { } @Override public void swipeRight() { } @Override public void swipeLeft() { } @Override public void swipeDown() { } @Override public void onText(CharSequence text) { } @Override public void onRelease(int primaryCode) { } @Override public void onPress(int primaryCode) { } //一些特殊操作按键的codes是固定的比如完成、回退等 @Override public void onKey(int primaryCode, int[] keyCodes) { Editable editable = ed.getText(); int start = ed.getSelectionStart(); if (primaryCode == Keyboard.KEYCODE_DELETE) {// 回退 if (editable != null && editable.length() > 0) { if (start > 0) { editable.delete(start - 1, start); } } }else if (primaryCode == Keyboard.KEYCODE_CANCEL) {// 完成 hideKeyboard(); } else { //将要输入的数字现在编辑框中 editable.insert(start, Character.toString((char) primaryCode)); } } }; public void showKeyboard() { keyboardView.setVisibility(View.VISIBLE); } public void hideKeyboard() { keyboardView.setVisibility(View.GONE); } public int getKeyboardVisible() { return keyboardView.getVisibility(); }}number.xml 注意该文件需要放在项目下的res目录下的xml目录(没有就建个)里面<?xml version="1.0" encoding="utf-8"?><Keyboard xmlns:android="http://schemas.android.com/apk/res/android" android:horizontalGap="0px" android:keyHeight="42dip" android:keyWidth="31%p" android:verticalGap="0px" > <Row> <Key android:codes="49" android:keyLabel="1" /> <Key android:codes="50" android:keyLabel="2" /> <Key android:codes="51" android:keyLabel="3" /> </Row> <Row> <Key android:codes="52" android:keyLabel="4" /> <Key android:codes="53" android:keyLabel="5" /> <Key android:codes="54" android:keyLabel="6" /> </Row> <Row> <Key android:codes="55" android:keyLabel="7" /> <Key android:codes="56" android:keyLabel="8" /> <Key android:codes="57" android:keyLabel="9" /> </Row> <Row> <Key android:codes="-3" android:keyLabel="完成" /> <Key android:codes="48" android:keyLabel="0" /> <Key android:codes="-5" android:keyIcon="@drawable/sym_keyboard_delete" /> </Row> </Keyboard>attrs.xml里面的样式:<!-- 支付密码输入框 --> <declare-styleable name="PasswordInputView"> <attr name="borderWidth" format="dimension"/> <attr name="borderColor" format="color"/> <attr name="borderRadius" format="dimension"/> <attr name="passwordLength" format="integer"/> <attr name="passwordWidth" format="dimension"/> <attr name="passwordColor" format="color"/> <attr name="passwordRadius" format="dimension"/> </declare-styleable>布局代码:<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/main_bg_color" > <include android:id="@+id/title_ll" layout="@layout/common_actionbar"/> <TextView android:id="@+id/trader_pwd_set_tips_textview" style="@style/normal_text_style" android:layout_below="@+id/title_ll" android:layout_marginTop="25dip" android:layout_centerHorizontal="true" android:text="@string/trade_pwd_set_tips_text" /> <ImageView android:id="@+id/line1_imageview" style="@style/line_horizontal_style" android:layout_below="@+id/trader_pwd_set_tips_textview" android:layout_marginTop="26dip" android:contentDescription="@string/content_description" /> <com.acoe.demo.widget.PasswordInputView android:id="@+id/trader_pwd_set_pwd_edittext" android:layout_width="match_parent" android:layout_height="41dip" android:layout_below="@+id/line1_imageview" android:maxLength="6" android:background="@android:color/white" /> <ImageView android:id="@+id/line2_imageview" style="@style/line_horizontal_style" android:layout_below="@+id/trader_pwd_set_pwd_edittext" android:contentDescription="@string/content_description" /> <Button android:id="@+id/trader_pwd_set_next_button" style="@style/main_button_style" android:layout_below="@+id/line2_imageview" android:layout_marginTop="25dip" android:text="@string/trade_pwd_set_next_text" /> <android.inputmethodservice.KeyboardView android:id="@+id/keyboard_view" android:layout_width="match_parent" android:layout_height="240dip" android:layout_alignParentBottom="true" android:paddingTop="30dip" android:paddingLeft="13dip" android:paddingRight="13dip" android:focusable="true" android:focusableInTouchMode="true" android:visibility="invisible"/> </RelativeLayout>Activity代码片段://=======在Activity成员变量中声明部分代码=======/** 控件 */ private PasswordInputView edtPwd; //=======在Activity实例化控件部分代码=======// 初始化控件 edtPwd = (PasswordInputView) findViewById(R.id.trader_pwd_set_pwd_edittext); edtPwd.setInputType(InputType.TYPE_NULL); // 屏蔽系统软键盘// 自定义软键盘 if (keyboardUtil == null) keyboardUtil = new NumKeyboardUtil(this, this, edtPwd); edtPwd.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { keyboardUtil.showKeyboard(); return false; } }); //=======在Activity中重写onTouchEvent()方法,实现点击空白处隐藏软键盘[email protected] public boolean onTouchEvent(MotionEvent event) { if(event.getAction() == MotionEvent.ACTION_DOWN){ if(getCurrentFocus()!=null && getCurrentFocus().getWindowToken()!=null){ keyboardUtil.hideKeyboard(); } } return super.onTouchEvent(event); }ps:如果把该密码输入框和其他类型输入框并用时要注意两者之间焦点变化时将系统软键盘和自定义的数字键盘隐藏,我的做法是给密码输入框绑定OnFacusChangeListener事件,来控制就好。如下:edtPwd.setOnFocusChangeListener(new OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { // 如果系统键盘是弹出状态,先隐藏 ((InputMethodManager) getSystemService(INPUT_METHOD_SERVICE)) .hideSoftInputFromWindow(getCurrentFocus() .getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); keyboardUtil.showKeyboard(); } else { keyboardUtil.hideKeyboard(); } } });以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

定时的功能我们在手机上见得比较多,比如定时清理垃圾,闹钟,等等.定时功能在java中主要使用的就是Timer对象,他在内部使用的就是多线程的技术.Time类主要负责完成定时计划任务的功能,就是在指定的时间的开始执行某个任务.Timer类的作用是设置计划任务,而封装任务内容的类是TimerTask类.此类是一个抽象类,继承需要实现一个run方法.通过查文档我们看到Timer有以下几个构造函数: Timer的方法以下这么多:下面我们通过定时器来完成一个简单功能,就是在运行项目三秒后,在控制台打印出"您该起床了",来模拟一下闹钟的功能:package com.wang.reflect;import java.util.Timer;import java.util.TimerTask;class MyTask extends TimerTask{ @Override public void run() { System.out.println("您该起床了!!!!"); }}public class TimerDemo { public static void main(String[] args) { //创建定时器对象 Timer t=new Timer(); //在3秒后执行MyTask类中的run方法 t.schedule(new MyTask(), 3000); }}运行后,我们发现三秒后控制台打印出了相当的文字,但是任务虽然执行完了,进程却没有销毁,还是呈红色状态,这是什么原因呢?创建了一个Timer就相当于启动了一个新线程,这个新线程并不是守护线程,所以会一直运行.在Time类和TimerTask类中都有一个cancel()方法.TimerTask类中的作用是:将自身从任务队列中清除,(一个Timer对象可以执行多个Timertask任务)Timer类中的作用是:将任务队列中的全部任务清空.下面写一个实例,定时删除指定磁盘某个目录下的所有文件:package com.wang.reflect;import java.io.File;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Timer;import java.util.TimerTask;class MyTask extends TimerTask{/** * 定时删除指定位置的文件,(这里以删除f盘下aa文件夹的所有文件为例) */ @Override public void run() { File file=new File("f://aa"); deleteFolder(file); } public void deleteFolder(File file){ File[] files=file.listFiles(); for(File f:files){ if(f.isDirectory()){ //使用递归 deleteFolder(f); }else{ f.delete(); } } file.delete(); } }public class TimerDemo { public static void main(String[] args) throws ParseException { //创建定时器对象 Timer t=new Timer(); String time="2016-04-04 11:26:40"; Date d=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(time); t.schedule(new MyTask(), d); }}注意,如果在上面测试代码中,我给出的Date类型的时间,早于当前的时间.则会立即执行task任务.以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

分类:36salon手机版

时间:2016-09-05 02:33:10