Android核心基礎三


sharedpreferences存儲配置信息



首先要明確一點,首選項一般都是以XML文件的形式來存儲數據。那麼關於首選項,還是以一個案例來說明把,

樣寫很難寫清楚。關於首選項請參見案例部分的SeekBar進度條。

XML文件的生成方法

首先是一個按鈕,點以下就會生成一個XML文件。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:onClick="create"
        android:text="生成xml文件" />

</RelativeLayout

然後去模型層去構建一個Person模型。

package com.itcast.xmlcreate.domain;

public class Person {

	public int id;
	public String name;
	public int age;
	public Person() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Person(int id, String name, int age) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
	}
	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
	}
	
	
}

最後就是把對象轉換成XML文件,也就是XML文件的生成,具體的在註釋中都有介紹。

package com.itcast.xmlcreate;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlSerializer;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Xml;
import android.view.Menu;
import android.view.View;

import com.itcast.xmlcreate.domain.Person;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.activity_main, menu);
		return true;
	}

	
	public void create(View v){
		//把對象集合保存成xml
		/**
		 * 1 構建對象集合
		 * 2 生成xml文件   android.util.Xml 工具類  提供了方法
		 * <persons>
		 *     <person id = "0">
		 *         <name>李先生0</name>
		 *         <age>16</age>
		 *     </person>
		 *     ....
		 * </persons>
		 */
		List<Person> list = new ArrayList<Person>();
		for(int i = 0;i<5;i++){
			list.add(new Person(i,"李先生"+i, 16+i));
		}
		
		//xml序列化器
		XmlSerializer serializer = Xml.newSerializer();
		try {
			
			FileOutputStream os = openFileOutput("persons.xml", Context.MODE_PRIVATE);
			//設置輸出流
			serializer.setOutput(os, "utf-8");
		
			//開始文檔
			serializer.startDocument("UTF-8", true);
			
			//開始標籤
			serializer.startTag(null, "persons");
			
			for(Person person:list){
				serializer.startTag(null, "person");
				//屬性
				serializer.attribute(null, "id", person.id+"");
				
				//name標籤
				serializer.startTag(null, "name");
				//文本
				serializer.text(person.name);
				serializer.endTag(null, "name");
				
				//age標籤
				serializer.startTag(null, "age");
				//文本
				serializer.text(person.age+"");
				serializer.endTag(null, "age");
				
				serializer.endTag(null, "person");
			}
			
			//結束標籤
			serializer.endTag(null, "persons");
			
			//結束文檔
			serializer.endDocument();
			
			os.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
}

XML文件,個人感覺其實就是三個作用吧。

存儲數據

作爲配置文件

作爲一個標準在網絡間傳遞數據




XML文件的解析


這裏着重來說以下pull解析。pull解析是基於事件 可以解釋到指定的節點後,結束解析,Android系統底層

大部分都是使用pull解析。還是按照慣例上源碼。

首先還是來個按鈕吧,點擊可以解析XML文件。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:onClick="parser"
        android:text="解析xml" />

</RelativeLayout>

模型跟生成的一樣,這邊就不再贅述了。直接上解析部分的代碼。

package com.itcast.xmlparser;

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

import org.xmlpull.v1.XmlPullParser;

import com.itcast.xmlcreate.domain.Person;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.util.Xml;
import android.view.Menu;
import android.view.View;

public class MainActivity extends Activity {

	private static final String TAG = "MainActivity";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.activity_main, menu);
		return true;
	}
	
	public void parser(View v){
		//解析xml
		/**
		 * 思路:
		 * 1 要解析的文件上/mnt/sdcard/persons.xml
		 * 2 如何解析  XmlPullParser  Xml.newPullParser()
		 */
		List<Person> list = null;
		Person person = null;
		
		XmlPullParser parser = Xml.newPullParser();
		
		try {
			File file = new File(Environment.getExternalStorageDirectory(),"persons.xml");
			InputStream inputStream = new FileInputStream(file);
			
			//設置解析的流
			parser.setInput(inputStream, "UTF-8");
			//得到事件類型
			int eventType = parser.getEventType();
			//判斷是否解析到了文檔結尾
			while(eventType != XmlPullParser.END_DOCUMENT){
				
				switch (eventType) {
				case XmlPullParser.START_TAG://開始標籤
					if("persons".equals(parser.getName())){
						list = new ArrayList<Person>();
					}else if("person".equals(parser.getName())){
						person = new Person();
						//獲取id屬性
						int id = Integer.parseInt(parser.getAttributeValue(0));
						person.id = id;
					}else if("name".equals(parser.getName())){
						String name = parser.nextText();//獲取下一個文本節點
						person.name = name;
					}else if("age".equals(parser.getName())){
						int age = Integer.parseInt(parser.nextText());
						person.age = age;
					}
					break;
				case XmlPullParser.END_TAG://結束標籤
					if("person".equals(parser.getName())){
						list.add(person);
						person = null;
					}
					break;

				default:
					break;
				}
				
				//繼續往下解析
				eventType = parser.next();
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		//打印看結果
		for (Person p : list) {
			Log.i(TAG, p.toString());
		}
		
	}

}

這些其實是跟核心基礎二在一起的,只是感覺比較長,所以另起一篇。Android基礎是重頭戲,絕不鬆懈!!努

力,加油!!~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章