当前位置:主页 > 移动开发 > Android代码 >

Android版学生管理系统

时间:2021-09-08 09:24:59 | 栏目:Android代码 | 点击:

用户可以输入姓名、性别、年龄三个字段,通过点击添加学生按钮,将学生信息展示到开始为空的ScrollView控件中,ScrollView控件只能包裹一个控件,我这里包裹的是LinearLayout。点击保存数据按钮将数据通过XmlSerializer对象将数据保存到sd卡中,当点击恢复数据按钮时将sd卡文件中的数据读取出来回显到ScrollView中。大概功能就是这样的,下面我们来看看具体的代码吧。

因为要读写文件,所以要在清单文件中添加两个权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

首先,我们画出UI界面,具体代码和效果如下:

<LinearLayout 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"
 android:orientation="vertical" >

 <TextView
  android:id="@+id/title"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_gravity="center_horizontal"
  android:layout_marginTop="5dip"
  android:textSize="28sp"
  android:textColor="#D5F2F4"
  android:text="学生管理系统" />

 <LinearLayout 
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:layout_marginTop="5dip"
  android:orientation="horizontal">

  <LinearLayout 
   android:layout_height="wrap_content"
   android:layout_width="0dip"
   android:layout_weight="1"
   android:orientation="vertical">

   <TextView 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:textSize="18sp"
    android:textColor="#DAD5D9"
    android:text="姓名"/>

   <EditText
    android:id="@+id/et_name" 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:singleLine="true"/>
  </LinearLayout>

  <LinearLayout 
   android:layout_height="wrap_content"
   android:layout_width="0dip"
   android:layout_weight="1"
   android:orientation="vertical">

   <TextView 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:textSize="18sp"
    android:textColor="#DAD5D9"
    android:text="性别"/>

   <EditText
    android:id="@+id/et_sex" 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:singleLine="true"/>
  </LinearLayout>

  <LinearLayout 
   android:layout_height="wrap_content"
   android:layout_width="0dip"
   android:layout_weight="1"
   android:orientation="vertical">

   <TextView 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:textSize="18sp"
    android:textColor="#DAD5D9"
    android:text="年龄"/>

   <EditText
    android:id="@+id/et_age" 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:inputType="number"
    android:singleLine="true"/>
  </LinearLayout>

  <Button 
   android:id="@+id/btn_add"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_gravity="bottom"
   android:textColor="@android:color/black"
   android:textSize="20sp"
   android:text="添加学生"/>

 </LinearLayout>

 <!-- ScrollView只可以包裹一个控件 -->
 <ScrollView 
  android:layout_width="fill_parent"
  android:layout_height="0dip"
  android:layout_weight="1"
  android:layout_marginTop="5dip">

  <LinearLayout 
   android:id="@+id/ll_student_group"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:orientation="vertical">

  </LinearLayout>

 </ScrollView>

 <LinearLayout 
  android:orientation="horizontal"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:layout_marginTop="5dip">

  <Button 
   android:id="@+id/btn_save"
   android:layout_width="0dip"
   android:layout_height="fill_parent"
   android:layout_weight="1"
   android:textSize="20sp"
   android:textColor="@android:color/black"
   android:text="保存数据"/>

  <Button 
   android:id="@+id/btn_restore"
   android:layout_width="0dip"
   android:layout_height="fill_parent"
   android:layout_weight="1"
   android:textSize="20sp"
   android:textColor="@android:color/black"
   android:text="恢复数据"/>
 </LinearLayout> 

</LinearLayout>

效果图:

之后我们要建立一个student的domain,就包括了三个字段,name、age、sex,为了方便观看,我也将Student代码也全部贴出来:

package cn.yzx.studentmanageros.domain;

public class Student {
 private String name;
 private String sex;
 private Integer age;

 public Student() {
  super();
  // TODO Auto-generated constructor stub
 }
 public Student(String name, String sex, Integer age) {
  super();
  this.name = name;
  this.sex = sex;
  this.age = age;
 }
 @Override
 public String toString() {
  return "Student [name=" + name + ", sex=" + sex + ", age=" + age + "]";
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getSex() {
  return sex;
 }
 public void setSex(String sex) {
  this.sex = sex;
 }
 public Integer getAge() {
  return age;
 }
 public void setAge(Integer age) {
  this.age = age;
 }

}

之后,也是最主要的,activity的实现文件,我这里直接将代码贴出来,因为注释的很清楚:

package cn.yzx.studentmanageros;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.Format;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Environment;
import android.text.TextUtils;
import android.util.Log;
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 cn.yzx.studentmanageros.domain.Student;


public class MainActivity extends Activity implements OnClickListener {

 private static final String TAG = "MainActivity";

 private EditText et_name;
 private EditText et_sex;
 private EditText et_age;
 private LinearLayout llStudentGroup; //学生列表控件
 private List<Student> studentList;

 private File cacheFile = new File(Environment.getExternalStorageDirectory(), "student.xml");

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

 private void init() {
  studentList = new ArrayList<Student>();

  et_name = (EditText) findViewById(R.id.et_name);
  et_sex = (EditText) findViewById(R.id.et_sex);
  et_age = (EditText) findViewById(R.id.et_age);

  llStudentGroup = (LinearLayout) findViewById(R.id.ll_student_group);

  findViewById(R.id.btn_add).setOnClickListener(this);
  findViewById(R.id.btn_save).setOnClickListener(this);
  findViewById(R.id.btn_restore).setOnClickListener(this);

 }

 @Override
 public void onClick(View v) {
  switch (v.getId()) {
  case R.id.btn_add: //添加学生
   //取出数据
   String name = et_name.getText().toString();
   String sex = et_sex.getText().toString();
   String age = et_age.getText().toString();

   //控制台打印数据
   Log.e(TAG, "name="+name+",sex="+sex+",age="+age);

   //判断是否有数据为空
   if(TextUtils.isEmpty(name) || TextUtils.isEmpty(sex) || TextUtils.isEmpty(age)){
    Toast.makeText(this, "请重新输入", 0).show();
    break;
   }

   //封装成Student实体
   Student student = new Student(name, sex, Integer.valueOf(age));

   //添加到学生列表中
   addToStudentList(student);

   break;

  case R.id.btn_save: //保存数据
   boolean isSuccess = saveStudentList();
   if(isSuccess){
    Toast.makeText(this, "保存成功", 0).show();
   }else {
    Toast.makeText(this, "保存失败", 0).show();
   }
   break;

  case R.id.btn_restore: //恢复数据
   // 恢复数据之前, 需要把集合中和LinearLayout中的数据全部清空
   studentList.clear();

   // 把线性布局中所有的控件全部移除
   llStudentGroup.removeAllViews();

   //从文件中读取数据
   List<Student> readStudentList = readStudentList();

   // 把取出回来的数据, 一条一条的添加到学生列表中
   for (Student stu : readStudentList) {
    addToStudentList(stu);
   }

   break;

  default:
   break;
  }
 }

 private List<Student> readStudentList() {
  List<Student> studentList = null;

  // 构建一个XmlPullParser解析器对象
  XmlPullParser parser = Xml.newPullParser();

  // 指定要解析的文件
  try {
   parser.setInput(new FileInputStream(cacheFile), "utf-8");

   // 开始解析: 获取EventType解析事件, 循环去判断事件
   int eventType = parser.getEventType();

   Student student = null;
   while(eventType!=XmlPullParser.END_DOCUMENT){
    // 当前的事件类型不等于结束的document, 继续循环
    String tagName = parser.getName();

    switch (eventType) {
    case XmlPullParser.START_TAG:
     if("students".equals(tagName)){//<students>
      studentList = new ArrayList<Student>();
     }else if ("student".equals(tagName)) {//<student>
      student = new Student();
     }else if ("name".equals(tagName)) {
      student.setName(parser.nextText());
     }else if ("sex".equals(tagName)) {
      student.setSex(parser.nextText());
     }else if("age".equals(tagName)){
      student.setAge(Integer.valueOf(parser.nextText()));
     }
     break;

    case XmlPullParser.END_TAG:
     if("student".equals(tagName)){
      studentList.add(student);
     }
     break;

    default:
     break;
    }
    eventType = parser.next(); // 取下一个事件类型
   }

   return studentList;
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return null;
 }

 private boolean saveStudentList() {
  String path = cacheFile.getPath();
  Log.e(TAG, "保存文件的路径:"+path);

  //得到一个序列化对象
  XmlSerializer serializer = Xml.newSerializer();

  try {
   //指定输出流
   serializer.setOutput(new FileOutputStream(cacheFile), "utf-8");

   //写start_document
   serializer.startDocument("utf-8", true);

   // 写<students>
   serializer.startTag(null, "students");

   for (Student student : studentList) {
    Log.e(TAG, student.toString());
    // 写<student>
    serializer.startTag(null, "student");

     // 写<name>
     serializer.startTag(null, "name");

     serializer.text(student.getName());

     // 写</name>
     serializer.endTag(null, "name");

     // 写<sex>
     serializer.startTag(null, "sex");

     serializer.text(student.getSex()); 

     // 写</sex>
     serializer.endTag(null, "sex");

     // 写<age>
     serializer.startTag(null, "age");

     serializer.text(String.valueOf(student.getAge())); 

     // 写</age>
     serializer.endTag(null, "age");

    // 写</student>
    serializer.endTag(null, "student");
   }

   // 写</students>
   serializer.endTag(null, "students");

   //写end_document
   serializer.endDocument();


   return true;
  } catch(Exception e) {
   e.printStackTrace();
  }

  return false;
 }

 /**
  * 把给定的学生添加到学生列表中
  * @param student
  */
 private void addToStudentList(Student student) {
  // 把学生信息添加到集合中, 为了方便呆会去保存
  studentList.add(student);

  //创建一个TextView对象,并设置其内容
  TextView tv = new TextView(this);
  String text = "  "+student.getName()+" "+student.getSex()+"  "+student.getAge();
  tv.setText(text);
  tv.setTextSize(18);
  tv.setTextColor(Color.BLACK);

  // 把TextView添加到学生列表中
  llStudentGroup.addView(tv);
 }
}

大家可以试试,有什么问题可以留言讨论,本人才学android,希望各位大神指正。

您可能感兴趣的文章:

相关文章