安卓 Android之开发简单小应用(二)
一、简述
学生籍贯管理小应用练习,简单的一个小应用,用SQLite数据库进行数据存储。
源文件打包:(附带txt文件存储版本)
链接:https://pan.baidu.com/s/1iyev4ix7Jp5EXywKbB9QAg 密码:2zy5
二、效果
三、工程结构
四、源码文件
AddActivity.java文件
扫描二维码关注公众号,回复:
2346982 查看本文章
package com.example.stunpmng;
import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;
@SuppressLint("NewApi") public class AddActivity extends Activity implements OnClickListener{
private EditText _edtid,_edtname;//学号、姓名文本框
private Spinner _spNP;//籍贯下拉选择框
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add);//设置布局
//获取控件对象
Button btncel = (Button)findViewById(R.id.btn_cel);
Button btnsur = (Button)findViewById(R.id.btn_sur);
Button btnback = (Button)findViewById(R.id.btn_back);
//监听单击事件
btncel.setOnClickListener(this);
btnsur.setOnClickListener(this);
btnback.setOnClickListener(this);
//成员变量初始化
_edtid = (EditText)findViewById(R.id.edt_id);
_edtname = (EditText)findViewById(R.id.edt_name);
_spNP = (Spinner)findViewById(R.id.spn_np);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.add, menu);
return true;
}
@Override
public void onClick(View arg) {//处理单击事件
switch (arg.getId())
{
case R.id.btn_cel://取消按钮
case R.id.btn_back://返回按钮
//返回、并设置结果码为1
setResult(1,(new Intent()).setAction("MainActivity.class"));
finish();//关闭当前页面
break;
case R.id.btn_sur://确定按钮
String stu_num = _edtid.getText().toString().trim();//获取学号输入框的内容,并去掉前后空格
String stu_name = _edtname.getText().toString().trim();//获取姓名输入框的内容,并去掉前后空格
String NP = (String) _spNP.getSelectedItem();//获取籍贯下拉框选中的文本
Student st = new Student(null,stu_num,stu_name,NP);//根据输入信息创建新的对象
if(stu_num.isEmpty() || stu_name.isEmpty())//学号、姓名不能为空
{
//弹出小黑框提示,一会儿自动消失
Toast.makeText(this,"学号、姓名不能为空",Toast.LENGTH_SHORT).show();
}
else
{
StuInfoDao dao = new StuInfoDao(this);//获取数据库操作类
//System.out.println(stu_num+"--"+stu_name+"--"+NP);
boolean b = dao.insert(st);//添加到数据库
if(b)
{
//添加成功,提示信息
Toast.makeText(this,"添加成功!",Toast.LENGTH_SHORT).show();
}
}
break;
}
}
}
MainActivity.java文件
package com.example.stunpmng;
import java.util.ArrayList;
import java.util.List;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.text.InputFilter;
import android.text.InputType;
import android.view.Gravity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.GridLayout;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
import android.widget.Toast;
@SuppressLint("NewApi") public class MainActivity extends Activity implements OnClickListener{
public List<Student> list = new ArrayList<Student>();//用来存放所有的学生对象
private TableLayout table;//用来展示数据
private int index;//index是分页查询的起始索引
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);//设置布局
//根据ID获取控件的对象,ID在对应的布局文件可以查看,或者是在属性页面也有
Button btnadd = (Button)findViewById(R.id.btn_add);
Button btnsch = (Button)findViewById(R.id.btn_sch);
Button btnnext = (Button)findViewById(R.id.btn_next);
Button btnup = (Button)findViewById(R.id.btn_up);
Button btnclr = (Button)findViewById(R.id.btn_clr);
Button btnrfl = (Button)findViewById(R.id.btn_rfl);
Button btnexit = (Button)findViewById(R.id.btn_exit);
Button btnout = (Button)findViewById(R.id.btn_out);
table = (TableLayout)findViewById(R.id.tab_show);
table.setBackgroundColor(Color.GREEN);//设置背景色
//监听按钮的点击事件,(意思就是当单击控件时本页面能够监听到并且响应 )
btnadd.setOnClickListener(this);
btnsch.setOnClickListener(this);
btnnext.setOnClickListener(this);
btnup.setOnClickListener(this);
btnclr.setOnClickListener(this);
btnrfl.setOnClickListener(this);
btnexit.setOnClickListener(this);
btnout.setOnClickListener(this);
index = 0;//刚开始时从第一条数据开始展示
Read();//读取数据库数据,存放到list集合中
Show(index);//根据索引展示数据
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public void onClick(View arg) {//处理点击事件
switch (arg.getId())
{
case R.id.btn_add://添加按钮
Intent intent = new Intent(MainActivity.this,AddActivity.class);//跳转到添加信息页面
startActivityForResult(intent, 1);//设置请求码为1
break;
case R.id.btn_rfl://刷新按钮
table.removeAllViews();//清空table数据
Read();//重新读取数据库数据,放到list集合中
Show(index);//根据当前索引展示数据
break;
case R.id.btn_sch://查询按钮
EditText edtsch = (EditText)findViewById(R.id.edt_sch);//根据ID获取到文本输入对象
String target = edtsch.getText().toString().trim();//获取到文本输入框的内容并且去掉前后的空格
//Toast.makeText(this,"search:"+target,Toast.LENGTH_SHORT).show();
Read();//重新读取数据库数据,放到list集合中
if(target.isEmpty())//如果搜索文本为空,那么显示全部
{
Show(index);
}
else//搜索文本不为空
{
for(int i=0;i<list.size();i++)//实现模糊查询,
{
//只要搜索关键字没有出现在学号、姓名、籍贯当中,就从list集合中去掉
if(( !target.equalsIgnoreCase(list.get(i).getNum())) &&(!list.get(i).getNum().contains(target))&& (!target.equalsIgnoreCase(list.get(i).getName())) && (!list.get(i).getName().contains(target))&&(!list.get(i).getNP().contains(target)) &&(!target.equalsIgnoreCase(list.get(i).getNP())))
{
list.remove(i);
--i;//进行删除后list的长度发生变化,后面的往前移,所以索引不用变,这里减1是要与后面的++相抵消
}
}
table.removeAllViews();//清空table
Show(0);//展示符合关键字的数据
}
break;
case R.id.btn_next://下一页按钮
if((index+5)<list.size()) index +=5;//索引加5,每页5条数据,索引值不能大于集合总数
Show(index);//根据当前索引显示数据
break;
case R.id.btn_up://上一页按钮
index -=5;//每次索引减5
if(index<0)//索引范围在0~list集合的总数
{
index = 0;//如果索引值小于0,将索引置为0
}
Show(index);//根据当前索引显示数据
break;
case R.id.btn_clr://清空数据库表数据,开发的时候方便自己测试,有时候数据是不合法的也存进去了,要清空
//弹出一个对话框,确认是否清空数据
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("操作"); //对话框标题
builder.setMessage("您确定清空吗?");//设置对话框内容提示
builder.setNegativeButton("取消",null); //添加一个取消按钮
//添加一个确定按钮,并且单击时响应
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which)
{
StuInfoDao dao = new StuInfoDao(MainActivity.this);
dao.deleteTab(false);//清空表数据,如果是true那么是删除表
table.removeAllViews();//清空table数据
//弹出一个小黑框,一会自动隐去
Toast.makeText(MainActivity.this,"清空成功!",Toast.LENGTH_SHORT).show();
}
});
builder.show();//显示对话框
break;
case R.id.btn_exit://退出按钮
//弹出一个对话框,确认是否退出
AlertDialog.Builder builderExit = new AlertDialog.Builder(MainActivity.this);
builderExit.setTitle("退出"); //对话框标题
builderExit.setMessage("您确定退出吗?");//设置对话框内容提示
builderExit.setNegativeButton("取消",null); //添加一个取消按钮
//添加一个确定按钮,并且单击时响应
builderExit.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();//关闭本页面
}
});
builderExit.show();
break;
case R.id.btn_out://导出按钮
Read();//重新读取数据库数据,放到list集合中
//弹出一个对话框,让用户输入文件名,路径默认
AlertDialog.Builder builderout = new AlertDialog.Builder(this);
builderout.setTitle("请输入文件名"); //对话框标题
final EditText edtname = new EditText(this);//创建一个文本输入框
edtname.setSingleLine();//设置文本输入框为单行输入
edtname.setFilters(new InputFilter[]{
new InputFilter.LengthFilter(64)//设置文本输入框的输入长度为64个字符
});
builderout.setView(edtname);//将文本输入框添加到对话框
builderout.setNegativeButton("取消",null); //添加一个取消按钮
//添加一个确定按钮,并且单击时响应
builderout.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String name = edtname.getText().toString().trim();//获取文本输入框的内容并且去掉前后空格
if(name.isEmpty())//如果文件名为空
{
//弹出一个小黑框提示,一会儿会自动隐去
Toast.makeText(MainActivity.this,"文件名不能为空!",Toast.LENGTH_SHORT).show();
}
else//如果文件名不为空
{
if(!name.endsWith(".txt"))//如果文件名不是以.txt结尾的
{
name += ".txt";//在结尾处添加.txt
}
StringBuilder content = new StringBuilder();//在对大量字符串操作时,StringBuilder优于String,因为String有唯一性
for(int i=0;i<list.size();i++)
{
content.append(list.get(i).toString()+"\n");//将list集合中的数据以字符形式存放到content中
}
boolean b = TxtFile.Save(name,content.toString(),false);//将内容覆盖保存到txt文件中
if(b)
{
//如果保存成功,小黑框提示
Toast.makeText(MainActivity.this,"导出成功!",Toast.LENGTH_SHORT).show();
}
}
}
});
builderout.show();//弹出对话框
break;
}
}
@Override //此函数是子activity关闭返回时执行的
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if(requestCode ==1 && resultCode==1)//当请求码以及结果码为1时,(即添加信息页面关闭返回时)
{
//当添加页面关闭返回是,主页面进行刷新操作
table.removeAllViews();//清空table数据
Read();//重新读取数据库数据,放到list集合中
Show(index);//根据索引展示当数据
System.out.println("刷新成功!");
}
}
private void Read()
{
StuInfoDao dao = new StuInfoDao(MainActivity.this);//创建数据操作类
list.clear();//清空list集合
list = dao.search();//查询数据库,将数据填充到list
}
private void Show(int start)//根据索引展示数据,每页5条数据
{
if(list.size()<=0 || list.isEmpty())//数据为空不显示
{
return;
}
//调整使得strat、end在0~list集合索引之间
if(start>=list.size())
{
start = list.size()-list.size()%5;
}
if(start<0)
{
start = 0;
}
int end = start+5;
if(end >list.size())
{
end = list.size();
}
table.removeAllViews();//清空table数据
for(int i=start;i<end;i++)//从start显示到end
{//每次循环创建一行,一行有四个标签,分别显示序号、学号、姓名、籍贯
TableRow row = new TableRow(MainActivity.this);//创建一行
row.setId(i);//设置当前行ID
row.setPadding(6,1,6,1);//设置内边距,左上右下
row.setGravity(Gravity.CENTER);//居中
row.setBackgroundColor(Color.GREEN);//设置行背景色
TextView view0 = new TextView(MainActivity.this);//创建一个标签,用来显示序号
view0.setText(i+1+"");//设置显示文本为"索引加1"
view0.setGravity(Gravity.CENTER);//居中
view0.setTextSize(18);//设置字体大小
view0.setTextColor(Color.RED);//设置字体颜色
view0.setPadding(10,2,10,2);//设置内边距
row.addView(view0);//将序号标签添加到行
TextView view1 = new TextView(MainActivity.this);//创建一个标签,用来显示学号
view1.setText(list.get(i).getNum());//设置显示文本为学号
view1.setGravity(Gravity.CENTER);
view1.setTextSize(18);
view1.setTextColor(Color.RED);
view1.setPadding(10,2,10,2);
row.addView(view1);//将学号标签添加到行
TextView view2 = new TextView(MainActivity.this);//创建一个标签,用来显示姓名
view2.setText(list.get(i).getName());//设置显示文本为姓名
view2.setGravity(Gravity.CENTER);
view2.setTextSize(18);
view2.setTextColor(Color.RED);
view2.setPadding(10,2,10,2);
row.addView(view2);//将姓名标签添加到行
TextView view3 = new TextView(MainActivity.this);//创建一个标签,用来显示籍贯
view3.setText(list.get(i).getNP());//设置显示文本为籍贯
view3.setGravity(Gravity.CENTER);
view3.setTextSize(18);
view3.setTextColor(Color.RED);
view3.setPadding(10,2,10,2);
row.addView(view3);//将籍贯标签添加到行
if(i%2==0) //偶数背景色为蓝色
{
row.setBackgroundColor(Color.argb(255, 64, 158, 211));
}
//为每一行添加 长按事件 (长按弹出编辑框) 并传递索引
row.setOnLongClickListener(new MyListener(i));
table.addView(row);//将行添加到table中
}
}
private class MyListener implements OnLongClickListener
{//处理长按事件
private EditText edtid,edtname;//学号、姓名编辑框(籍贯不用改)
int n = 0;//根据n找到对应的对象
public MyListener(int i)
{
super();
this.n = i;//接收长按时传递过来的索引
}
@Override
public boolean onLongClick(View arg0)
{
if(n<0 || n>=list.size())
{
return true;
}
//弹出编辑框
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("操作"); //设置标题
//创建一个网格布局,用来放置两个标签、两个输入框
GridLayout grid = new GridLayout(MainActivity.this);
grid.setColumnCount(2);//设置网格的列数
TextView viewNP = new TextView(MainActivity.this);//创建籍贯标签
viewNP.setText("籍贯:"+list.get(n).getNP());//设置文本
grid.addView(viewNP, 0);//将籍贯标签添加到网格布局的第1列
TextView viewname = new TextView(MainActivity.this);//创建姓名标签
viewname.setText("姓名:");//设置标签文本
edtname = new EditText(MainActivity.this);//创建一个输入框
edtname.setSingleLine();//设置单行输入
edtname.setFilters(new InputFilter[]{
new InputFilter.LengthFilter(4)//设置输入长度
});
//viewname.setLeft(0);
edtname.setText(list.get(n).getName());//设置文本框内容
grid.addView(viewname, 0);//将姓名标签添加到网格布局中
grid.addView(edtname, 1);//将文本框添加到网格布局中
TextView viewid = new TextView(MainActivity.this);//创建学号标签
viewid.setText("学号:");
edtid = new EditText(MainActivity.this);//创建学号输入框
edtid.setSingleLine();//设置为单行输入
edtid.setFilters(new InputFilter[]{
new InputFilter.LengthFilter(4)//设置输入长度
});
edtid.setInputType(InputType.TYPE_CLASS_NUMBER);//设置为只能输入数字
edtid.setText(list.get(n).getNum());//设置文本
grid.addView(viewid, 0);//将学号标签添加到网格布局
grid.addView(edtid, 1);//将学号输入框添加到网格布局
builder.setView(grid);//将网格布局添加到对话框中
builder.setNegativeButton("取消",null); //添加取消按钮
//添加一个删除按钮,并添加点击事件处理
builder.setNeutralButton("删除", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String sid = list.get(n).getId();//获取长按项对应的学生ID
StuInfoDao dao = new StuInfoDao(MainActivity.this);//创建数据库操作类
//list.clear();//清空集合
//list = dao.search();//读取数据库,并将数据填充到list
dao.delete(sid);//删除ID对应的学生信息
table.removeAllViews();//清除table数据
Read();//读取数据库,并将数据填充到list
Show(index);//刷新,根据索引值显示数据
//弹出小黑框提示删除成功,一会儿自动隐去
Toast.makeText(MainActivity.this,"删除成功!",Toast.LENGTH_SHORT).show();
}
});
//添加修改按钮,并添加点击事件处理
builder.setPositiveButton("修改", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String sid = list.get(n).getId();//获取长按项对应的学生ID
String stu_num = edtid.getText().toString().trim();//获取修改后的学号,并去掉前后空格
String stu_name = edtname.getText().toString().trim();//获取修改后的姓名,并去掉前后空格
if(stu_num.isEmpty() || stu_name.isEmpty())//如果修改后的学号或姓名为空
{
//提示不能为空
Toast.makeText(MainActivity.this,"学号、姓名不能为空!",Toast.LENGTH_SHORT).show();
}
else//修改后的数据合法
{
//根据修改后的信息,新建一个student对象
Student st = new Student(sid,stu_num,stu_name,list.get(n).getNP());
StuInfoDao dao = new StuInfoDao(MainActivity.this);//创建数据库操作类
dao.update(st);//更新数据
table.removeAllViews();//清空table数据
Read();//读取数据库,并将数据填充到list
Show(index);//刷新,根据索引值显示数据
//提示修改成功
Toast.makeText(MainActivity.this,"修改成功!",Toast.LENGTH_SHORT).show();
}
}
});
builder.show(); //弹出编辑框
return true;
}
}
}
MySQLHelper.java文件
package com.example.stunpmng;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class MySQLHelper extends SQLiteOpenHelper {
public MySQLHelper(Context context) {
super(context, "mydatabase.db", null, 1);//创建mydatabase.db数据库,版本号为1
}
@Override
public void onCreate(SQLiteDatabase db) {
//创建studentNP表 _id字段为主键,自增 ,num字段存储学号、varchar类型,长度为8,name字段存储姓名,类型为varchar,长度为8,np字段存储籍贯,类型为varchar,长度为64
db.execSQL("create table studentNP (_id integer primary key autoincrement, num varchar(8),name varchar(8),np varchar(64))");
}
@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
// TODO Auto-generated method stub
}
}
Student.java文件
package com.example.stunpmng;
public class Student {
private String id;//ID
private String num;//学号
private String name;//姓名
private String np;//籍贯名
//下面的是属性 (对字段的保护)
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getNum() {
return num;
}
public void setNum(String num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNP() {
return np;
}
public void setNP(String np) {
this.np = np;
}
//有参构造函数 (方便构造对象)
public Student(String id,String num,String name, String np) {
super();
this.id = id;
this.num = num;
this.name = name;
this.np = np;
}
//无参构造对象 (如果有有参构造函数,最好加上无参构造函数)
public Student() {
super();
}
@Override //重写toString()方法,将一个对象的数据信息变为字符串格式,方便存储到txt文件中
public String toString() {
return num + "-" + name + "-" + np;
}
}
StuInfoDao.java文件
package com.example.stunpmng;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
public class StuInfoDao {
MySQLHelper helper;//成员变量
public StuInfoDao(Context context){
helper = new MySQLHelper(context);//创建一个SQLHelper
}
public boolean insert(Student st){//添加操作
//拿到 工具类的实例 , 然后去操作 数据库
SQLiteDatabase db = helper.getWritableDatabase();
//执行 sql 语句 主键自增,不用设置
db.execSQL("insert into studentNP values(null,?,?,?)",new Object[]{st.getNum(),st.getName(),st.getNP()});
return true;
}
public void delete(String id){
//根据ID删除信息
SQLiteDatabase db = helper.getWritableDatabase();
db.execSQL("delete from studentNP where _id=?",new Object[]{id});
}
public void deleteTab(boolean isDrop){//清空表数据,或删除表,此处是为了方便程序测试,因为可能编写过程中不合法的数据也添加进去了,需要进行清空操作
SQLiteDatabase db = helper.getWritableDatabase();
if(isDrop)
{
db.execSQL("drop table studentNP ");//删除表
}
else
{
db.execSQL("delete from studentNP ");//清空表的数据
}
}
public void update(Student st){//根据对象进行更新操作
SQLiteDatabase db = helper.getWritableDatabase();
db.execSQL("update studentNP set num=?,name=?,np=? where _id=?", new Object[]{st.getNum(),st.getName(),st.getNP(),st.getId()});
}
public Student find(String id){//根据ID进行查找对应的student信息,例子中没有用到
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cursor = db.rawQuery("select * from studentNP where _id=?", new String[]{id});
boolean result = cursor.moveToNext();//是否有下一条数据
Student st = null;
if(result){
int _id = cursor.getInt(cursor.getColumnIndex("_id"));//获取ID
String snum = cursor.getString(cursor.getColumnIndex("num"));//获取学号
String name = cursor.getString(cursor.getColumnIndex("name"));//获取姓名
String sex = cursor.getString(cursor.getColumnIndex("np"));//获取籍贯
st = new Student(String.valueOf(_id),snum,name,sex);//将数据放入新的对象
}
// 最后会释放 资源
cursor.close();
return st;
}
public List<Student> search(){//查询所有的信息
SQLiteDatabase db = helper.getReadableDatabase();
List<Student> list = new ArrayList<Student>();
list.clear();//清空数据
//查询全部数据
Cursor cursor = db.rawQuery("select * from studentNP" ,null);
while(cursor.moveToNext()){
int _id = cursor.getInt(cursor.getColumnIndex("_id"));
String snum = cursor.getString(cursor.getColumnIndex("num"));
String name = cursor.getString(cursor.getColumnIndex("name"));
String sex = cursor.getString(cursor.getColumnIndex("np"));
Student st = new Student(String.valueOf(_id),snum,name,sex);
list.add(st);//将新对象添加到list集合
}
//System.out.println("数目:"+list.size());
// 最后会释放 资源
cursor.close();
return list;//将所有信息返回
}
}
TextFile.java文件
package com.example.stunpmng;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import android.os.Environment;
public class TxtFile {//保存文件工具类 //fileName:文件名称 content:文件内容 isAppend:是否追加(否则覆盖)
public static boolean Save(String fileName,String content,boolean isAppend)
{
//在文本文本中追加内容
String sdCardDir =Environment.getExternalStorageDirectory().getAbsolutePath();
File file = new File(sdCardDir,fileName);
//System.out.println(sdCardDir);
BufferedWriter out = null;
try {
if(!file.exists())//如果文件不存在
{
file.createNewFile();//创建文件
}
FileOutputStream outStream = new FileOutputStream(file,isAppend);
outStream.write(content.getBytes());
outStream.close();//记得关闭流
System.out.println("save success!");
return true;
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(out != null){
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return false;
}
}
五、总结
1、添加SDcard读写权限
2、打开File Explorer窗口 (虚拟设备的文件列表)
3、下拉框的选项内容在activity_add.xml布局文件中