xml解析自定义类,并且初始化相关值


一直都维护Camera 其中有个解析XML并填充到相应的控件一直都没有深入了解,只是知道是如此,今天简单的写了一个xml解析,并且填充的测试代码。


xml pull解析,其实都没太用,只是简单的处理了一下数据。

不废话了,先贴一下主要的代码


package com.example.xmltest; import java.lang.reflect.Constructor; import java.util.ArrayList; import java.util.HashMap; import org.xmlpull.v1.XmlPullParser; import android.os.Bundle; import android.app.Activity; import android.content.Context; import android.content.res.XmlResourceParser; import android.util.AttributeSet; import android.util.Log; import android.util.Xml; import android.view.Menu; import android.widget.Toast; public class MainActivity extends Activity { public Context mContext; private static final String PACKAGE_NAME = MainActivity.class.getPackage().getName(); private static final HashMap<String,Constructor<?>> sConstructorMap = new HashMap<String, Constructor<?>>(); private static final Class<?>[] CTOR_SIGNATURE = new Class[] {Context.class, AttributeSet.class}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mContext = this; operate(); } private void operate() { XmlResourceParser parser = getResources().getXml(R.xml.info); inflate(parser); } /** * 这里是解析并且填充 list * 注意Xml.asAttributeSet(parser) 返回的这个attrs SDK 对它的解释是 * Return an AttributeSet interface for use with the given XmlPullParser. * Returns * An AttributeSet you can use to retrieve the attribute values at * each of the tags as the parser moves through its XML document. * 当parser在XML文件移动的时候(调用parser.next()的时候) 你可以用这个AttributeSet来取回 对应的attribute的值 * 可以理解为 只要你next了 attrs对应的值就改变了,这一点很重要,在很长的一段时间内我都没能理解这个问题。SDK 仍然需要多读 * @param parser */ private void inflate(XmlResourceParser parser) { AttributeSet attrs = Xml.asAttributeSet(parser); //Log.v("TAG","attrs:"+attrs.getAttributeCount()); //makeText(this, ""+attrs.getAttributeCount(), 0).show(); ArrayList<person> list = new ArrayList<person>(); Object args[] = new Object[]{mContext,attrs}; try { for (int type = parser.next(); type != XmlPullParser.END_DOCUMENT; type = parser.next()){ Log.v("TAG"," only for attrs:"+((AttributeSet)args[1])); if(type != XmlPullParser.START_TAG) { Log.v("TAG","start tag name:"+parser.getName()); Log.v("TAG"," ! start tag for attrs:"+((AttributeSet)args[1]).getAttributeCount()); continue;} else if(parser.getName().equals("School")) { Log.v("TAG"," school for attrs:"+((AttributeSet)args[1]).getAttributeCount()); continue; } Log.v("TAG"," for attrs:"+((AttributeSet)args[1]).getAttributeCount()); Person person = newPerson(parser.getName(),args); Log.v("TAG","name:"+person.name+" age:"+person.age); list.add(person); } } catch (Exception e) { // TODO: handle exception } } private Person newPerson(String tagName, Object[] args) { String name = PACKAGE_NAME + "." + tagName; Constructor<?> constructor = sConstructorMap.get(name); try { if(constructor == null){ Class<?> clazz = mContext.getClassLoader().loadClass(name); /* * getClassLoader() Return a class loader you can use to * retrieve classes in this package. * 返回一个类加载器,你可以使用它加载这个包中的类 * loadClass Loads the class with the specified name. Invoking this * method is equivalent to calling loadClass(className, false). * 根据这个特定的名字加载相应的类,调用这个方法相当于调用 loadClass(className, false) */ constructor = clazz.getConstructor(CTOR_SIGNATURE); /* getConstructor * Returns a Constructor object which represents the public constructor * matching the specified parameter types. * 返回一个Constructor对象 ,该对象表示共有构造函数所匹配的特定参数类型 */ sConstructorMap.put(name, constructor); } return (Person)constructor.newInstance(args); /*constructor.newInstance * Returns a new instance of the declaring class, initialized by dynamically(动态) * invoking the constructor represented by this Constructor object. * 返回一个声明类的新实例,通过动态的调用Constructor所代表的构造函数初始化 * args the arguments to the constructor 构造函数的参数(真正的值) * */ } catch (Exception e) { // TODO: handle exception } return null; } } </person></person>


这里面的反射机制比较多,用到的地方我都加入了解释,这里就不多赘述了。主要就是上面代码进行解析,处理,还有初始化。Camera 里面的很多参数都是通过 读取这个XML 然后和相应的Camera上传参数进行匹配,匹配成功则保留,不成功就删除,然后显示到界面上供用户使用。(虽然现在好多手机几乎不提供太多选项,但是原理是如此)。


剩下的还有一些关于 自定义控件属性的只是 values 下 attrs.xml 关于这个 需要看一下 自定义控件的相关知识就明白了。


稍后提供DEMO下载链接

http://download.csdn.net/detail/shen332401890/5292400

点击下载Demo

你可能感兴趣的:(android,xml)