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文件,個人感覺其實就是三個作用吧。1 存儲數據
2 作爲配置文件
3 作爲一個標準在網絡間傳遞數據
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基礎是重頭戲,絕不鬆懈!!努
力,加油!!~