最終要做的項目目标:
2、編寫android清單檔案androidmanifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.itheima27.sutdentmanager"
android:versioncode="1"
android:versionname="1.0" >
<uses-sdk
android:minsdkversion="8"
android:targetsdkversion="19" />
<uses-permission android:name="android.permission.write_external_storage"/>
<application
android:allowbackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/apptheme" >
<activity
android:name="com.itheima27.sutdentmanager.mainactivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.main" />
<category android:name="android.intent.category.launcher" />
</intent-filter>
</activity>
</application>
</manifest>
3 編寫布局檔案activity_main.xml
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"
android:orientation="vertical" >
<textview
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_margintop="5dip"
android:text="學生管理系統"
android:textcolor="#99ccff"
android:textsize="23sp"/>
<relativelayout
android:layout_width="fill_parent"
android:padding="5dip">
<textview
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingleft="15dip"
android:paddingright="15dip"
android:text="姓名"
android:textsize="18sp" />
android:id="@+id/tv_sex"
android:layout_marginleft="5dip"
android:layout_torightof="@id/tv_name"
android:text="性别"
android:id="@+id/tv_age"
android:layout_torightof="@id/tv_sex"
android:text="年齡"
<!-- 在姓名的下面 -->
<edittext
android:id="@+id/et_name"
android:layout_alignleft="@id/tv_name"
android:layout_alignright="@id/tv_name"
android:layout_below="@id/tv_name"
android:singleline="true" />
<!-- 在性别的下面 -->
android:id="@+id/et_sex"
android:layout_alignleft="@id/tv_sex"
android:layout_alignright="@id/tv_sex"
android:layout_below="@id/tv_sex"
android:id="@+id/et_age"
android:layout_alignleft="@id/tv_age"
android:layout_alignright="@id/tv_age"
android:layout_below="@id/tv_age"
android:inputtype="number"
<button
android:id="@+id/btn_add_student"
android:layout_alignbaseline="@id/et_age"
android:layout_torightof="@id/et_age"
android:text="添加學生"
android:textsize="20sp" />
</relativelayout>
<scrollview
android:layout_weight="1" >
<linearlayout
android:id="@+id/ll_student_list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_margin="1dip"
android:orientation="vertical"
android:padding="5dip" >
</linearlayout>
</scrollview>
<linearlayout
android:orientation="horizontal" >
android:id="@+id/btn_save"
android:layout_weight="1"
android:text="儲存資料"
android:id="@+id/btn_restore"
android:text="恢複資料"
</linearlayout>
</linearlayout>
4 編寫student實體
package com.itheima27.sutdentmanager.entities;
public class student {
private string name;
private string sex;
private integer age;
public student() {
super();
}
public student(string name, string sex, integer age) {
this.name = name;
this.sex = sex;
this.age = age;
public string getname() {
return name;
public void setname(string name) {
public string getsex() {
return sex;
public void setsex(string sex) {
public integer getage() {
return age;
public void setage(integer age) {
@override
public string tostring() {
return "student [name=" + name + ", sex=" + sex + ", age=" + age + "]";
}
5 編寫mainactivity
package com.itheima27.sutdentmanager;
import java.io.fileinputstream;
import java.io.fileoutputstream;
import java.util.arraylist;
import java.util.list;
import org.xmlpull.v1.xmlpullparser;
import org.xmlpull.v1.xmlserializer;
import android.graphics.color;
import android.os.bundle;
import android.os.environment;
import android.support.v7.app.actionbaractivity;
import android.text.textutils;
import android.util.xml;
import android.view.view;
import android.view.view.onclicklistener;
import android.widget.edittext;
import android.widget.linearlayout;
import android.widget.textview;
import android.widget.toast;
import com.itheima27.sutdentmanager.entities.student;
public class mainactivity extends actionbaractivity implements onclicklistener {
private edittext etname;
private edittext etsex;
private edittext etage;
private linearlayout llstudentlist;
private list<student> studentlist;
private string filepath;
protected void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.activity_main);
init();
private void init() {
etname = (edittext) findviewbyid(r.id.et_name);
etsex = (edittext) findviewbyid(r.id.et_sex);
etage = (edittext) findviewbyid(r.id.et_age);
llstudentlist = (linearlayout) findviewbyid(r.id.ll_student_list);
findviewbyid(r.id.btn_save).setonclicklistener(this);
findviewbyid(r.id.btn_restore).setonclicklistener(this);
findviewbyid(r.id.btn_add_student).setonclicklistener(this);
studentlist = new arraylist<student>();
filepath = environment.getexternalstoragedirectory().getpath() + "/student.xml";
public void onclick(view v) {
switch (v.getid()) {
case r.id.btn_save:
if(studentlist.size() > 0) {
//将資訊寫到xml檔案中
if(savestudent2local()) {
toast.maketext(this, "儲存成功", 0).show();
} else {
toast.maketext(this, "儲存失敗", 0).show();
}
} else {
toast.maketext(this, "目前沒有資料", 0).show();
}
break;
case r.id.btn_restore:
if(restorestudentfromlocal()) {
toast.maketext(this, "恢複成功", 0).show();
toast.maketext(this, "恢複失敗", 0).show();
}
case r.id.btn_add_student:
addstudent();
default:
}
/**
* 從xml中讀出student資料
* @return
*/
private boolean restorestudentfromlocal() {
try {
xmlpullparser parser = xml.newpullparser();
parser.setinput(new fileinputstream(filepath), "utf-8");
int eventtype = parser.geteventtype();
studentlist.clear();
student student = null;
string nodename = null;
while(eventtype != xmlpullparser.end_document) {
nodename = parser.getname();
switch (eventtype) {
case xmlpullparser.start_tag:
if("student".equals(nodename)) {
student = new student();
} else if("name".equals(nodename)) {
student.setname(parser.nexttext());
} else if("sex".equals(nodename)) {
student.setsex(parser.nexttext());
} else if("age".equals(nodename)) {
student.setage(integer.valueof(parser.nexttext()));
}
break;
case xmlpullparser.end_tag:
studentlist.add(student);
default:
eventtype = parser.next();
refreshstudentlist();
return true;
} catch (exception e) {
e.printstacktrace();
return false;
* 恢複student的list清單
private void refreshstudentlist() {
llstudentlist.removeallviews();
textview childview;
for (student student : studentlist) {
childview = new textview(this);
childview.settextsize(23);
childview.settextcolor(color.black);
childview.settext(" " + student.getname() + " " + student.getsex() + " " + student.getage());
llstudentlist.addview(childview);
private boolean savestudent2local() {
xmlserializer serializer = xml.newserializer();
serializer.setoutput(new fileoutputstream(filepath), "utf-8");
serializer.startdocument("utf-8", true);
serializer.starttag(null, "infos");
for (student stu : studentlist) {
serializer.starttag(null, "student");
serializer.starttag(null, "name");
serializer.text(stu.getname());
serializer.endtag(null, "name");
serializer.starttag(null, "sex");
serializer.text(stu.getsex());
serializer.endtag(null, "sex");
serializer.starttag(null, "age");
serializer.text(string.valueof(stu.getage()));
serializer.endtag(null, "age");
serializer.endtag(null, "student");
serializer.endtag(null, "infos");
serializer.enddocument();
private void addstudent() {
string name = etname.gettext().tostring();
string sex = etsex.gettext().tostring();
string age = etage.gettext().tostring();
if(!textutils.isempty(name)
&& !textutils.isempty(sex)
&& !textutils.isempty(age)) {
studentlist.add(new student(name, sex, integer.valueof(age)));
textview childview = new textview(this);
childview.settext(" " + name + " " + sex + " " + age);
} else {
toast.maketext(this, "請正确輸入", 0).show();