1.团队成员
马玉娟 1600802053 162班 https://www.cnblogs.com/huanmeng/
高志杰 1600802039 162班 https://www.cnblogs.com/gao98
高怡 1600802040 162班 https://http://www.cnblogs.com/luy011/
2.APK链接
https://git.dev.tencent.com/gao2039/Schedule_apk.git
3.项目代码地址
https://git.dev.tencent.com/gao2039/Schedule.git
4.介绍团队项目
4.1 团队项目总体效果截图
4.2实现的功能及其效果的描述
4.2.1新建课程并完善所有课程信息
4.2.2对已有课程进行修改
4.2.3关于项目的相关信息
4.2.4 显示退出提示
4.2.5 完整流程录屏
4.2.6 修改以及删除录屏
4.2.7 设置部分录屏
5. 项目关键代码
5.1 创建数据库
public class DataBase extends SQLiteOpenHelper{ private final static String DB_NAME="myBase"; private final static String[] TB_NAME={"Mon","Tue","Wed","Thur","Fri","Sat","Sun"}; public final static String ID="_id"; public final static String CLASS="classes"; public final static String LOCA="location"; public final static String TEACHER="teacher"; public final static String ZHOUSHU="zhoushu"; public final static String JIESHU="jieshu"; public final static String TIME1="time1"; public final static String TIME2="time2"; public final static String WHICH="which"; public DataBase(Context context){ super(context,DB_NAME,null,1); } @Override public void onCreate(SQLiteDatabase db) { for(int i=0;i<7;i++){ String sql="CREATE TABLE "+TB_NAME[i]+" (_id INTEGER primary key autoincrement,classes varchar(70),location varchar(70)," + "teacher varchar(70),zhoushu varchar(70),time1 varchar(70),time2 varchar(70),jieshu varchar(70),which varchar(70))"; db.execSQL(sql); } }
5.2 数据库的插入、删除、修改、更新等操作
public void onUpgrade(SQLiteDatabase db, int oleVersion, int newVersion) { for(int i=0;i<7;i++){ String sql="DROP TABLE IF EXISTS "+TB_NAME[i]; db.execSQL(sql); } onCreate(db); } public Cursor select(int i){ SQLiteDatabase db=DataBase.this.getReadableDatabase(); Cursor cursor=db.query(TB_NAME[i],null,null,null,null,null,null); return cursor; } public long insert(int i,String cla,String loca,String tea,String zhou,String jie,String time1,String time2,String which){ SQLiteDatabase db=DataBase.this.getWritableDatabase(); ContentValues cv=new ContentValues(); cv.put(CLASS,cla); cv.put(LOCA, loca); cv.put(TEACHER,tea); cv.put(ZHOUSHU,zhou); cv.put(JIESHU,jie); cv.put(TIME1,time1); cv.put(TIME2,time2); cv.put(WHICH,which); long row=db.insert(TB_NAME[i],null,cv); return row; } public void update(int i,int _id,String cla,String loca,String tea,String zhou,String jie,String time1,String time2,String which){ SQLiteDatabase db=DataBase.this.getWritableDatabase(); String where="_id = ?"; String[] whereValues={Integer.toString(_id)}; ContentValues cv=new ContentValues(); if(!cla.equals("")) cv.put(CLASS,cla); if(!loca.equals("")) cv.put(LOCA, loca); if(!tea.equals("")) cv.put(TEACHER,tea); if(!zhou.equals("")) cv.put(ZHOUSHU,zhou); if(!jie.equals("")) cv.put(JIESHU,jie); if(!time1.equals("")) cv.put(TIME1,time1); if(!time2.equals("")) cv.put(TIME2,time2); if(!which.equals("")) cv.put(WHICH,which); db.update(TB_NAME[i], cv, where, whereValues); } public void deleteData(int i,int _id){ SQLiteDatabase db=DataBase.this.getWritableDatabase(); String where="_id = ?"; String[] whereValues={Integer.toString(_id)}; ContentValues cv=new ContentValues(); cv.put("classes",""); cv.put("location",""); cv.put("teacher",""); cv.put("zhoushu",""); cv.put("jieshu",""); cv.put("time1",""); cv.put("time2",""); cv.put("which",""); db.update(TB_NAME[i], cv, where, whereValues); } public void delete(int i,int _id){ SQLiteDatabase db=this.getWritableDatabase(); String where="_id = ?"; String[] whereValues={Integer.toString(_id)}; db.delete(TB_NAME[i], where, whereValues); }
5.3 实现课程表的插入、删除
builder=new Builder(context) .setIcon(R.drawable.ic_launcher) .setTitle("编辑课程信息") .setView(view) .setPositiveButton("确认",new OnClickListener(){ @SuppressWarnings("deprecation") @Override public void onClick(DialogInterface arg0, int arg1) { if(!(s1=course_name.getText().toString()).equals("")) s1="课程: "+s1; if(!(s2=course_address.getText().toString()).equals("")) s2="地点: "+s2; if(!(s3=course_teacher.getText().toString()).equals("")) s3="老师: "+s3; if(!(s4=course_week.getText().toString()).equals("")) s4="周数: "+s4; if(!(s6=course_time1.getText().toString()).equals("")) s6="时间: "+s6; if(!(s7=course_time2.getText().toString()).equals("")) ; if((s5=course_count.getText().toString()).equals("")||s1.equals("")) { Toast.makeText(context, "请正确输入课程及节数!", 3000).show(); return; } else { int i=Integer.parseInt(s5.trim()); for(int m=0;m<i;m++){ MainActivity.db.update(day,n+m+1,s1,s2,s3,s4,s5,s6,s7,Integer.toString(m)); } } main.cursor[day].requery(); main.list[day].invalidate(); } }) .setNegativeButton("取消", new OnClickListener(){ @Override public void onClick(DialogInterface arg0, int arg1) { } }); builder.create().show(); } public void modify(final int day,final int n){ inflater=LayoutInflater.from(context); view=inflater.inflate(R.layout.edit_shedule,null); findWidgetes(); final Button course_time1=(Button)view.findViewById(R.id.time1); final Button course_time2=(Button)view.findViewById(R.id.time2); course_time1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { TimeSet_Dialog(course_time1); } }); course_time2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { TimeSet_Dialog(course_time2); } }); main.cursor[day].moveToPosition(n); String [] temp=new String[8]; for(int i=0;i<8;i++) {temp[i]=main.cursor[day].getString(i+1);} if(!temp[0].equals("")) course_name.setText(temp[0].substring(temp[0].indexOf(":")+2)); if(!temp[1].equals("")) course_address.setText(temp[1].substring(temp[1].indexOf(":")+2)); if(!temp[2].equals("")) course_teacher.setText(temp[2].substring(temp[2].indexOf(":")+2)); if(!temp[3].equals("")) course_week.setText(temp[3].substring(temp[3].indexOf(":")+2)); if(!temp[4].equals("")) course_time1.setText(temp[4].substring(temp[4].indexOf(":")+2)); course_time2.setText(temp[5]); course_count.setText(temp[6]); view.invalidate(); builder=new Builder(context) .setIcon(R.drawable.ic_launcher) .setTitle("修改课程信息") .setView(view) .setPositiveButton("确认",new OnClickListener(){ @SuppressWarnings("deprecation") @Override public void onClick(DialogInterface arg0, int arg1) { if(!(s1=course_name.getText().toString()).equals("")) s1="课程: "+s1; if(!(s2=course_address.getText().toString()).equals("")) s2="地点: "+s2; if(!(s3=course_teacher.getText().toString()).equals("")) s3="老师: "+s3; if(!(s4=course_week.getText().toString()).equals("")) s4="周数: "+s4; if(!(s6=course_time1.getText().toString()).equals(""))s6="时间: "+s6; if(!(s7=course_time2.getText().toString()).equals("")); s5=course_count.getText().toString(); main.cursor[day].moveToPosition(n); int n1=Integer.parseInt(main.cursor[day].getString(7).trim()); int n2=Integer.parseInt(main.cursor[day].getString(8).trim()); Log.i("kkk",main.cursor[day].getString(7)); if(s5.equals("")||n1==Integer.parseInt(s5.trim())) { switch(n2){ case 0: for(int m=0;m<n1;m++){ MainActivity.db.update(day,n+m+1,s1,s2,s3,s4,s5,s6,s7,Integer.toString(m)); } break; case 1: MainActivity.db.update(day,n,s1,s2,s3,s4,s5,s6,s7,"0"); for(int m=1;m<n1;m++){ MainActivity.db.update(day,n+m,s1,s2,s3,s4,s5,s6,s7,Integer.toString(m)); } break; case 2: MainActivity.db.update(day,n-1,s1,s2,s3,s4,s5,s6,s7,"0"); MainActivity.db.update(day,n,s1,s2,s3,s4,s5,s6,s7,"1"); for(int m=2;m<n1;m++){ MainActivity.db.update(day,n+m-1,s1,s2,s3,s4,s5,s6,s7,Integer.toString(m)); } break; case 3: for(int m=n2;m>=0;m--){ MainActivity.db.update(day,n-m+1,s1,s2,s3,s4,s5,s6,s7,Integer.toString(n2-m)); } break; } } else{ int n3=Integer.parseInt(s5.trim()); if(n3>n1){ switch(n2){ case 0: for(int m=0;m<n3;m++){ MainActivity.db.update(day,n+m+1,s1,s2,s3,s4,s5,s6,s7,Integer.toString(m)); } break; case 1: MainActivity.db.update(day,n,s1,s2,s3,s4,s5,s6,s7,"0"); for(int m=1;m<n3;m++){ MainActivity.db.update(day,n+m,s1,s2,s3,s4,s5,s6,s7,Integer.toString(m)); } break; case 2: MainActivity.db.update(day,n-1,s1,s2,s3,s4,s5,s6,s7,"0"); MainActivity.db.update(day,n,s1,s2,s3,s4,s5,s6,s7,"1"); for(int m=2;m<n3;m++){ MainActivity.db.update(day,n+m-1,s1,s2,s3,s4,s5,s6,s7,Integer.toString(m)); } break; case 3: for(int m=n2;m>=0;m--){ MainActivity.db.update(day,n-m+1,s1,s2,s3,s4,s5,s6,s7,Integer.toString(n2-m)); } break; } } if(n3<n1){ switch(n2){ case 0: for(int m=0;m<n1;m++){ MainActivity.db.deleteData(day,n+m+1); } break; case 1: MainActivity.db.deleteData(day,n); for(int m=1;m<n1;m++){ MainActivity.db.deleteData(day,n+m); } break; case 2: MainActivity.db.deleteData(day,n-1); MainActivity.db.deleteData(day,n); for(int m=2;m<n1;m++){ MainActivity.db.deleteData(day,n+m-1); } break; case 3: for(int m=n2;m>=0;m--){ MainActivity.db.deleteData(day,n-m+1); } break; default: Toast.makeText(context, "error", 3000).show(); break; } switch(n2){ case 0: for(int m=0;m<n3;m++){ MainActivity.db.update(day,n+m+1,s1,s2,s3,s4,s5,s6,s7,Integer.toString(m)); } break; case 1: MainActivity.db.update(day,n,s1,s2,s3,s4,s5,s6,s7,"0"); for(int m=1;m<n3;m++){ MainActivity.db.update(day,n+m,s1,s2,s3,s4,s5,s6,s7,Integer.toString(m)); } break; case 2: MainActivity.db.update(day,n-1,s1,s2,s3,s4,s5,s6,s7,"0"); MainActivity.db.update(day,n,s1,s2,s3,s4,s5,s6,s7,"1"); for(int m=2;m<n3;m++){ MainActivity.db.update(day,n+m-1,s1,s2,s3,s4,s5,s6,s7,Integer.toString(m)); } break; case 3: for(int m=0;m<n3;m++){ MainActivity.db.update(day,n+m-2,s1,s2,s3,s4,s5,s6,s7,Integer.toString(m)); } break; } } } main.cursor[day].requery(); main.list[day].invalidate(); } }) .setNegativeButton("取消", new OnClickListener(){ @Override public void onClick(DialogInterface arg0, int arg1) { } }); builder.create().show(); }
5.4 显示当天的课表
public static int getWeekDay(){ Calendar calendar=Calendar.getInstance(); Date date=new Date(System.currentTimeMillis()); calendar.setTime(date); int weekDay=calendar.get(Calendar.DAY_OF_WEEK)-1; return weekDay; }
6.项目对比
(1)第1名:汤文涛 杨圣豪 黄东强 组的简单校园二手交易APP
一句话描述:比较简介实用的二手交易平台
优点:实现了登录、注册上传商品、查看我的发布、查看所有商品、查看某个商品的详细信息、给商家留言等多种功能,功能齐全,运行流畅。
缺点:界面布局不是很美观,字体较大,图标比较简易
如果我们来做:如果我们来做,我们会在实现基础功能的基础上,把界面布局也做的美观一点
(2)第2名: 李怡龙 刘志祥 刘显云 网络连接APP
一句话描述:测试网络连接相关数据的APP
优点:APP方向新颖、功能完善、实现了局域网连接的相关参数显示,功能简洁明了,UI界面也相当大方简单,同时实现了PC端的项目实现,运用到了我们很多没有学过的知识。
缺点:UI界面简洁明了但是美观程度差了一点
如果我们来做:我们会完善APP的界面,尽可能做到简洁美观,大方明了。
(3)第3名:沈顺文的代码杀APP
一句话描述:功能强大的代码在线交流、学习平台
优点:实现了登陆、上传、代码交流排序最新最热,个人页面的设置等等相关功能。在界面美观大方的同时,功能实现也相当完整,是一个使用相当顺畅的APP。
缺点:最好能实现一个添加好友的功能
如果我们来做:如果我们来做,我们会实现一个添加好友与好友交流的简要功能实现。
(4)第4名:李凯 季轩石组计划APP
一句话描述:功能强大、完善的计划 设置置顶提醒APP。
优点:UI界面十分好看,使用也流畅,简洁的APP使计划提醒与设置十分简洁完善。实现了计划设定,任务打卡,还有任务提醒的功能,同时实现了多个主题风格的使用,是一个相当完善的小程序了。
如果我们来做:如果我们来做,我们应该做不到这样的UI页面设置。但是我们应该会添加一个任务未完成自动启动飞行模式功能。
(5)第5名:季澈 张文君 郭守杰组的音乐播放器
一句话描述:简易便捷的音乐播放器
优点:实现了本地搜索功能,实现了播放器应有的上一曲,下一曲,开始暂停,播放顺序,音量的控制,进度条,歌词,删除歌曲等的所有功能,比较实用
缺点:UI界面网络搜索等功能未实现
如果我们来做:我们会在实现了本地搜索歌曲的基础上,实现部分网络搜索功能
7.问题及解决方法
7.1课程表修改时布局问题:1600802053 马玉娟
在课程表修改时,之前只能按照插入时的布局进行修改,在参考网上相关资料后发现,inflater 动态布局,可根据需求改变界面:
public void modify(final int day,final int n){
inflater=LayoutInflater.from(context);
view=inflater.inflate(R.layout.edit_shedule,null);
findWidgetes();
final Button course_time1=(Button)view.findViewById(R.id.time1);
final Button course_time2=(Button)view.findViewById(R.id.time2);
course_time1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TimeSet_Dialog(course_time1);
}
});
7.2 添加及修改时检测并提示:1600802053 马玉娟
之前添加以及修改课程表时,若不填其中一项,显示为空,没有任何提示,后来添加有关错误检测代码,解决相关问题,
若都正确提交到数据库,即可修改成功,否则重新填写。
if((s5=course_count.getText().toString()).equals("")||s1.equals("")) { Toast.makeText(context, "请正确输入课程及节数!", 3000).show(); return; } else { int i=Integer.parseInt(s5.trim()); for(int m=0;m<i;m++){ MainActivity.db.update(day,n+m+1,s1,s2,s3,s4,s5,s6,s7,Integer.toString(m)); } } main.cursor[day].requery(); main.list[day].invalidate(); } })
7.3 数据库的创建与更新:1600802039 高志杰
之前数据库一直无法升级更新,显示出错,后来参考网上有关数据库的升级,解决问题
public void onUpgrade(SQLiteDatabase db, int oleVersion, int newVersion) { for(int i=0;i<7;i++){ String sql="DROP TABLE IF EXISTS "+TB_NAME[i]; db.execSQL(sql); } onCreate(db); }
7.4 以选择的方式显示时间 :1600802039 高志杰
添加时间时本来想直接手写添加,后来查资料发现可以用上下拉动的方式显示
final Button course_time1=(Button)view.findViewById(R.id.time1); final Button course_time2=(Button)view.findViewById(R.id.time2); course_time1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { TimeSet_Dialog(course_time1); } }); course_time2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { TimeSet_Dialog(course_time2); } }); main.cursor[day].moveToPosition(n); String [] temp=new String[8]; for(int i=0;i<8;i++) {temp[i]=main.cursor[day].getString(i+1);} if(!temp[0].equals("")) course_name.setText(temp[0].substring(temp[0].indexOf(":")+2)); if(!temp[1].equals("")) course_address.setText(temp[1].substring(temp[1].indexOf(":")+2)); if(!temp[2].equals("")) course_teacher.setText(temp[2].substring(temp[2].indexOf(":")+2)); if(!temp[3].equals("")) course_week.setText(temp[3].substring(temp[3].indexOf(":")+2)); if(!temp[4].equals("")) course_time1.setText(temp[4].substring(temp[4].indexOf(":")+2)); course_time2.setText(temp[5]); course_count.setText(temp[6]); view.invalidate();
7.5 定位到当天的课程表:1600802040 高怡
之前课程表打开时,一直显示星期日的课程表,查看当天课程表必须点击到当天的星期,后来定位当天的星期,直接打开显示当天课程表
public static int getWeekDay(){ Calendar calendar=Calendar.getInstance(); Date date=new Date(System.currentTimeMillis()); calendar.setTime(date); int weekDay=calendar.get(Calendar.DAY_OF_WEEK)-1; return weekDay; }
7.6显示课程表标识: 1600802040 高怡
之前做的APK在手机上安装后,标识都是安卓小机器人,不是很美观,查阅资料后,将标识设置为自定义图片
<application
android:icon="@drawable/ic_launcher"
8. 分工安排
姓名 | 分工 | 工作比例 | 分数 |
高志杰 | 数据库设计、时间显示 | 34% | 10 |
马玉娟 | 课程表创建、编辑、连接 | 33% | 10 |
高怡 | UI设计,连接后端,定位星期 | 33% | 10 |