热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

android(12)(简单学生管理系统,包括文件写入SD卡,pull解析xml文件等)

1.布局代码:<LinearLayoutxmlns:androandroid:layout
1.布局代码:
"http://schemas.android.com/apk/res/android"
android:layout_hljs-string">"match_parent"
android:layout_hljs-string">"match_parent"
android:background="@android:color/white"
android:orientation="vertical" >

android:layout_hljs-string">"wrap_content"
android:layout_hljs-string">"wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="5dip"
android:text="学生管理系统"
android:textColor="#99CCFF"
android:textSize="23sp" />

android:layout_hljs-string">"fill_parent"
android:layout_hljs-string">"wrap_content"
android:layout_marginTop="5dip"
android:padding="5dip" >

android:id="@+id/tv_name"
android:layout_hljs-string">"wrap_content"
android:layout_hljs-string">"wrap_content"
android:paddingLeft="15dip"
android:paddingRight="15dip"
android:text="姓名"
android:textSize="18sp" />

android:id="@+id/tv_sex"
android:layout_hljs-string">"wrap_content"
android:layout_hljs-string">"wrap_content"
android:layout_marginLeft="5dip"
android:layout_toRightOf="@id/tv_name"
android:paddingLeft="15dip"
android:paddingRight="15dip"
android:text="性别"
android:textSize="18sp" />

android:id="@+id/tv_age"
android:layout_hljs-string">"wrap_content"
android:layout_hljs-string">"wrap_content"
android:layout_marginLeft="5dip"
android:layout_toRightOf="@id/tv_sex"
android:paddingLeft="15dip"
android:paddingRight="15dip"
android:text="年龄"
android:textSize="18sp" />

android:id="@+id/et_name"
android:layout_hljs-string">"wrap_content"
android:layout_hljs-string">"wrap_content"
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_hljs-string">"wrap_content"
android:layout_hljs-string">"wrap_content"
android:layout_alignLeft="@id/tv_sex"
android:layout_alignRight="@id/tv_sex"
android:layout_below="@id/tv_sex"
android:singleLine="true" />

android:id="@+id/et_age"
android:layout_hljs-string">"wrap_content"
android:layout_hljs-string">"wrap_content"
android:layout_alignLeft="@id/tv_age"
android:layout_alignRight="@id/tv_age"
android:layout_below="@id/tv_age"
android:inputType="number"
android:singleLine="true" />

android:id="@+id/btn_add_student"
android:layout_hljs-string">"wrap_content"
android:layout_hljs-string">"wrap_content"
android:layout_alignBaseline="@id/et_age"
android:layout_toRightOf="@id/et_age"
android:text="添加学生"
android:textSize="20sp" />


android:layout_hljs-string">"fill_parent"
android:layout_hljs-string">"wrap_content"
android:layout_weight="1" >

android:id="@+id/ll_student_list"
android:layout_hljs-string">"fill_parent"
android:layout_hljs-string">"fill_parent"
android:layout_margin="1dip"
android:orientation="vertical"
android:padding="5dip" >



android:layout_hljs-string">"fill_parent"
android:layout_hljs-string">"wrap_content"
android:layout_marginTop="5dip"
android:orientation="horizontal" >

android:id="@+id/btn_save"
android:layout_hljs-string">"wrap_content"
android:layout_hljs-string">"wrap_content"
android:layout_weight="1"
android:text="保存数据"
android:textSize="20sp" />

android:id="@+id/btn_restore"
android:layout_hljs-string">"wrap_content"
android:layout_hljs-string">"wrap_content"
android:layout_weight="1"
android:text="恢复数据"
android:textSize="20sp" />



entities类:
public class Student {

private String name;
private String sex;
private Integer age;
public Student(String name, String sex, Integer age) {
super();
this.name = name;
this.sex = sex;
this.age = age;
}
public Student() {
super();
// TODO Auto-generated constructor stub
}
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;
}
@Override
public String toString() {
return "Student [name=" + name + ", sex=" + sex + ", age=" + age + "]";
}
业务逻辑代码:
public class MainActivity extends Activity implements OnClickListener {

private EditText etName;
private EditText etSex;
private EditText etAge;
private LinearLayout llStudentList;
private List studentList;
private String filePath;

@Override
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();
filePath = Environment.getExternalStorageDirectory().getPath() + "/student.xml";//数据保存在SD卡的一个student的xml文件中。
}
//点击事件
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_save://如果点击的是保存数据按钮
if(studentList.size() > 0) {
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();
} else {
Toast.makeText(this, "恢复失败", 0).show();
}
break;
case R.id.btn_add_student://如果点击的是添加学生的按钮。
addStudent();
break;
default:
break;
}
}
//从本地恢复学生信息(xml解析)
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:
if("student".equals(nodeName)) {
studentList.add(student);
}
break;
default:
break;
}
eventType = parser.next();
}
refreshStudentList();

return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
//刷新学生集合(把添加的学生显示在ScrollView中)
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);
}
}
//保存数据到SD卡。
private boolean saveStudent2Local() {
try {
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();
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
//添加学生
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.setTextSize(23);
childView.setTextColor(Color.BLACK);
childView.setText("  " + name + "  " + sex + "  " + age);
llStudentList.addView(childView);
} else {
Toast.makeText(this, "请正确输入", 0).show();
}
}

推荐阅读
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文讲述了如何通过代码在Android中更改Recycler视图项的背景颜色。通过在onBindViewHolder方法中设置条件判断,可以实现根据条件改变背景颜色的效果。同时,还介绍了如何修改底部边框颜色以及提供了RecyclerView Fragment layout.xml和项目布局文件的示例代码。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 深入理解CSS中的margin属性及其应用场景
    本文主要介绍了CSS中的margin属性及其应用场景,包括垂直外边距合并、padding的使用时机、行内替换元素与费替换元素的区别、margin的基线、盒子的物理大小、显示大小、逻辑大小等知识点。通过深入理解这些概念,读者可以更好地掌握margin的用法和原理。同时,文中提供了一些相关的文档和规范供读者参考。 ... [详细]
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
  • C#多线程解决界面卡死问题的完美解决方案
    当界面需要在程序运行中不断更新数据时,使用多线程可以解决界面卡死的问题。一个主线程创建界面,使用一个子线程执行程序并更新主界面,可以避免卡死现象。本文分享了一个例子,供大家参考。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • 运算放大器使用规则及注意事项
    本文介绍了运算放大器的使用规则和注意事项,包括输入电压的限制、输出直接并接电容的安全性等。通过了解这些规则和注意事项,可以更好地使用运算放大器,避免出现意外情况。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 本文介绍了一款名为TimeSelector的Android日期时间选择器,采用了Material Design风格,可以在Android Studio中通过gradle添加依赖来使用,也可以在Eclipse中下载源码使用。文章详细介绍了TimeSelector的构造方法和参数说明,以及如何使用回调函数来处理选取时间后的操作。同时还提供了示例代码和可选的起始时间和结束时间设置。 ... [详细]
author-avatar
囡囡需要嗳
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有