android第四次作业
1.项目成员:
1500802085 翟伟朋 https://www.cnblogs.com/qhdxzwp/
1500802083 潘红睿 https://www.cnblogs.com/dasdad/
1600802104 赵彦卓 http://www.cnblogs.com/zyz666/
2.apk链接:
https://coding.net/s/ee7ba206-f276-4578-89b0-3fead8fe37cb
3.Coding代码链接:
https://coding.net/u/zwp598692456/p/AndroidProject/git/tree/master/shijianbiao
4.项目介绍:
(1)项目效果截图
主界面:
新建日程:
设置时间:
提醒:
(2).主要实现功能:
1.用户可以新建日程:新建日程时用户可以自定义日程类型、主题以及备注;同时用户还可以设置日程的时间;
2.用户新建日程后将以列表形式显示现有的日程;
3.用户可以点击更改背景颜色按钮后更改主界面的背景颜色;
4.用户在点击想查看的日程后再点击查看按钮即可查看日程的详细信息;
5.用户可以对日程进行修改以及删除
6.到日程指定时间时将弹出对话框进行提醒;
5.关键代码
建立数据库,创建数据表,编写静态Helper类,用于建立、更新和打开数据库。
public class DBAction {
private static final String DB_NAME = "agenda.db";
private static final String DB_TABLE1 = "aginfor";
private static final String DB_TABLE2 = "agtype";
private static final int DB_VERSION = 1;
public static final String KEY_TYPEID = "typeid";
public static final String KEY_AGENDAID = "agendaid";
public static final String KEY_AGTYPE = "agtype";
public static final String KEY_AGDATA = "agdata";
public static final String KEY_AGTIME = "agtime";
public static final String KEY_AGTITLE = "agtitle";
public static final String KEY_AGINFO = "aginfo";
public static final String KEY_ALARMTIME = "alarmtime";
public static final String KEY_TYPENAME = "typename";
private SQLiteDatabase db;
private final Context context;
private DBOpenHelper dbOpenHelper;
public DBAction(Context _context) {
context = _context;
}
/** Close the database */
public void close() {
if (db != null) {
db.close();
db = null;
}
}
/** Open the database */
public void open() throws SQLiteException {
dbOpenHelper = new DBOpenHelper(context, DB_NAME, null, DB_VERSION);
try {
db = dbOpenHelper.getWritableDatabase();
} catch (SQLiteException ex) {
db = dbOpenHelper.getReadableDatabase();
}
}
public AgModel[] queryType() {
Cursor results = db.query(DB_TABLE2, new String[] { KEY_TYPEID,
KEY_TYPENAME }, null, null, null, null, null);
return ConvertToTypeAgModel(results);
}
public AgModel[] queryAll() {
Cursor results = db.query(DB_TABLE1, new String[] { KEY_AGENDAID,
KEY_AGTYPE, KEY_AGDATA, KEY_AGTIME, KEY_AGTITLE, KEY_AGINFO,
KEY_ALARMTIME }, null, null, null, null, null);
return ConvertToAgModel(results);
}
public AgModel[] queryByID(int id) {
Cursor results = db.query(DB_TABLE1, new String[] { KEY_AGENDAID,
KEY_AGTYPE, KEY_AGDATA, KEY_AGTIME, KEY_AGTITLE, KEY_AGINFO,
KEY_ALARMTIME }, KEY_AGENDAID + "=" + id, null, null, null,
null);
return ConvertToAgModel(results);
}
public AgModel[] queryMAll(String m) {
Cursor results = db.query(DB_TABLE1, new String[] { KEY_AGENDAID,
KEY_AGTYPE, KEY_AGDATA, KEY_AGTIME, KEY_AGTITLE, KEY_AGINFO,
KEY_ALARMTIME }, KEY_AGTITLE + " like 'm%'", null, null, null,
null);
return ConvertToAgModel(results);
}
public long insertType(AgModel AgModel) {
ContentValues newValues = new ContentValues();
newValues.put(KEY_TYPENAME, AgModel.Typename);
return db.insert(DB_TABLE2, null, newValues);
}
public long updateOneData(long id, AgModel agModel) {
ContentValues updateValues = new ContentValues();
updateValues.put(KEY_AGTYPE, agModel.Agtype);
updateValues.put(KEY_AGDATA, agModel.Agdata);
updateValues.put(KEY_AGTIME, agModel.Agtime);
updateValues.put(KEY_AGTITLE, agModel.Agtitle);
updateValues.put(KEY_AGINFO, agModel.Aginfo);
updateValues.put(KEY_ALARMTIME, agModel.Alarmtime);
return db
.update(DB_TABLE1, updateValues, KEY_AGENDAID + "=" + id, null);
}
public long insert(AgModel AgModel) {
ContentValues newValues = new ContentValues();
newValues.put(KEY_AGTYPE, AgModel.Agtype);
newValues.put(KEY_AGDATA, AgModel.Agdata);
newValues.put(KEY_AGTIME, AgModel.Agtime);
newValues.put(KEY_AGTITLE, AgModel.Agtitle);
newValues.put(KEY_AGINFO, AgModel.Aginfo);
newValues.put(KEY_ALARMTIME, AgModel.Alarmtime);
return db.insert(DB_TABLE1, null, newValues);
}
private AgModel[] ConvertToTypeAgModel(Cursor cursor) {
// TODO Auto-generated method stub
int resultCounts = cursor.getCount();
if (resultCounts == 0 || !cursor.moveToFirst()) {
return null;
}
AgModel[] AgModels = new AgModel[resultCounts];
for (int i = 0; i < resultCounts; i++) {
AgModels[i] = new AgModel();
AgModels[i].TypeID = cursor.getInt(0);
AgModels[i].Typename = cursor.getString(cursor
.getColumnIndex(KEY_TYPENAME));
cursor.moveToNext();
}
if (cursor != null) {
cursor.close();
}
return AgModels;
}
public long deleteById(Object object) {
return db.delete(DB_TABLE1, KEY_AGENDAID + "=" + object, null);
}
public long deleteTypeById(Object object) {
return db.delete(DB_TABLE2, KEY_TYPEID + "=" + object, null);
}
private AgModel[] ConvertToAgModel(Cursor cursor) {
int resultCounts = cursor.getCount();
if (resultCounts == 0 || !cursor.moveToFirst()) {
return null;
}
AgModel[] AgModels = new AgModel[resultCounts];
for (int i = 0; i < resultCounts; i++) {
AgModels[i] = new AgModel();
AgModels[i].AgendaID = cursor.getInt(0);
AgModels[i].Agtype = cursor.getString(1);
AgModels[i].Agdata = cursor.getString(2);
AgModels[i].Agtime = cursor.getString(3);
AgModels[i].Agtitle = cursor.getString(cursor
.getColumnIndex(KEY_AGTITLE));
AgModels[i].Aginfo = cursor.getString(5);
AgModels[i].Alarmtime = cursor.getString(6);
cursor.moveToNext();
}
if (cursor != null) {
cursor.close();
}
return AgModels;
}
/** 静态Helper类,用于建立、更新和打开数据库 */
private static class DBOpenHelper extends SQLiteOpenHelper {
public DBOpenHelper(Context context, String name,
CursorFactory factory, int version) {
super(context, name, factory, version);
}
private static final String DB_CREATE1 = "create table " + DB_TABLE1
+ " (" + KEY_AGENDAID + " integer primary key autoincrement,"
+ KEY_AGTYPE + " text," + KEY_AGDATA + " text, " + KEY_AGTIME
+ " text, " + KEY_AGTITLE + " text," + KEY_AGINFO + " text,"
+ KEY_ALARMTIME + " text);";
private static final String DB_CREATE2 = "create table " + DB_TABLE2
+ " (" + KEY_TYPEID + " integer primary key autoincrement,"
+ KEY_TYPENAME + " text);";
@Override
public void onCreate(SQLiteDatabase _db) {
_db.execSQL(DB_CREATE1);
_db.execSQL(DB_CREATE2);
}
@Override
public void onUpgrade(SQLiteDatabase _db, int _oldVersion,
int _newVersion) {
_db.execSQL("DROP TABLE IF EXISTS " + DB_TABLE1);
_db.execSQL("DROP TABLE IF EXISTS " + DB_TABLE2);
onCreate(_db);
}
}
}
新建日程activity
public class NewAgendaActivity extends Activity implements OnClickListener,
OnDateSetListener, OnTimeSetListener, OnTimeChangedListener {
List<String> list;
private DBAction dbAdepter;
AgModel agModel;
EditText agtitle;
Button agdata;
Button agtime;
EditText aginfo;
Button alarm;
Spinner agtype;
Button insert;
Button come;
Button typeguan;
TextView disdate;
TextView distime;
TextView disalarm;
ArrayAdapter<String> adapter;
private int mYear;
private int mMonth;
private int mDay;
private int mHour;
private int mMinute;
private int nHour;
private int nMinute;
static final int TIME_DIALOG_ID = 0;
static final int DATE_DIALOG_ID = 1;
static final int ALARM_DIALOG_ID = 2;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.newag);
dbAdepter = new DBAction(this);
dbAdepter.open();
agModel = new AgModel();
disdate = (TextView) findViewById(R.id.datedisply);
distime = (TextView) findViewById(R.id.timedis);
disalarm = (TextView) findViewById(R.id.armdis);
agtitle = (EditText) findViewById(R.id.agtitle);
agdata = (Button) findViewById(R.id.selectdate);
agdata.setOnClickListener(this);
agtime = (Button) findViewById(R.id.selecttime);
agtime.setOnClickListener(this);
aginfo = (EditText) findViewById(R.id.aginfor);
alarm = (Button) findViewById(R.id.selectarm);
// alarm.setOnClickListener(this);
agtype = (Spinner) findViewById(R.id.typeselect);
insert = (Button) findViewById(R.id.insert);
come = (Button) findViewById(R.id.come);
typeguan = (Button) findViewById(R.id.typeguanli);
final Calendar calendar = Calendar.getInstance();
mYear = calendar.get(Calendar.YEAR);
mMonth = calendar.get(Calendar.MONTH);
mDay = calendar.get(Calendar.DAY_OF_MONTH);
mHour = calendar.get(Calendar.HOUR_OF_DAY);
mMinute = calendar.get(Calendar.MINUTE);
nHour = calendar.get(Calendar.HOUR_OF_DAY);
nMinute = calendar.get(Calendar.MINUTE);
list = new ArrayList<String>();
query();
adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, list);
adapter
.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
agtype.setAdapter(adapter);
agtype.setOnItemSelectedListener(new OnItemSelectedListener()// 选择日程类型
{
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
// TODO Auto-generated method stub
agModel.Agtype = arg0.getSelectedItem().toString();
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
});
typeguan.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent(getBaseContext(), Typeupdate.class);
startActivityForResult(intent, 1);
}
});
insert.setOnClickListener(new View.OnClickListener()// 添加日程
{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
agModel.Agtitle = agtitle.getText().toString();
agModel.Agdata = disdate.getText().toString();
agModel.Aginfo = aginfo.getText().toString();
agModel.Agtime = distime.getText().toString();
agModel.Alarmtime = disalarm.getText().toString();
long colunm = dbAdepter.insert(agModel);
if (colunm == -1) {
Toast.makeText(getApplication(), "添加过程失败!",
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(
getApplication(),
"成功添加数据,ID='" + String.valueOf(colunm)
+ "'", Toast.LENGTH_SHORT).show();
}
}
});
come.setOnClickListener(new View.OnClickListener()// 返回主页面
{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent reintent = new Intent();
setResult(RESULT_OK, reintent);
finish();
}
});
alarm.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
calendar.setTimeInMillis(System.currentTimeMillis());
new TimePickerDialog(NewAgendaActivity.this,
new TimePickerDialog.OnTimeSetListener() {
public void onTimeSet(TimePicker view,
int hourOfDay, int minute) {
calendar.setTimeInMillis(System
.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
calendar.set(Calendar.MINUTE, minute);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
/* 建立Intent和PendingIntent,来调用目标组件 */
Intent intent = new Intent(
NewAgendaActivity.this,
AlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent
.getBroadcast(NewAgendaActivity.this,
0, intent, 0);
AlarmManager am;
/* 获取闹钟管理的实例 */
am = (AlarmManager) getSystemService(ALARM_SERVICE);
/* 设置闹钟 */
am.set(AlarmManager.RTC_WAKEUP, calendar
.getTimeInMillis(), pendingIntent);
/*
* 设置周期闹
* am.setRepeating(AlarmManager.RTC_WAKEUP,
* System .currentTimeMillis() + (10 * 1000),
* (24 * 60 * 60 * 1000), pendingIntent);
*/
nHour = hourOfDay;
nMinute = minute;
updateDisplayAlarm();
}
}, nHour, nMinute, true).show();
}
});
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
query();
agtype.setAdapter(adapter);
}
/**
* 更新显示
*/
private void updateDisplayData() {
disdate.setText(new StringBuilder().append(mYear).append("年").append(
mMonth + 1).append("月").append(mDay).append("日"));
}
private void updateDisplayTime() {
distime.setText(new StringBuilder().append(pad(mHour)).append(":")
.append(pad(mMinute)));
}
private void updateDisplayAlarm() {
disalarm.setText(new StringBuilder().append(pad(nHour)).append(":")
.append(pad(nMinute)));
}
/**
* 时间点格式
*
* @param i
* @return
*/
private static String pad(int i) {
if (i >= 10)
return String.valueOf(i);
else
return "0" + String.valueOf(i);
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.selectdate) {
showDialog(DATE_DIALOG_ID);
}
if (v.getId() == R.id.selecttime) {
showDialog(TIME_DIALOG_ID);
}
}
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case TIME_DIALOG_ID:
return new TimePickerDialog(this, this, mHour, mMinute, false);
case DATE_DIALOG_ID:
return new DatePickerDialog(this, this, mYear, mMonth, mDay);
}
return null;
}
@Override
protected void onPrepareDialog(int id, Dialog dialog) {
switch (id) {
case TIME_DIALOG_ID:
((TimePickerDialog) dialog).updateTime(mHour, mMinute);
break;
case DATE_DIALOG_ID:
((DatePickerDialog) dialog).updateDate(mYear, mMonth, mDay);
break;
}
}
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
mYear = year;
mMonth = monthOfYear;
mDay = dayOfMonth;
updateDisplayData();
}
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
mHour = hourOfDay;
mMinute = minute;
updateDisplayTime();
}
public void query() {
list.removeAll(list);
AgModel[] AgModels = dbAdepter.queryType();
if (AgModels == null) {
Toast.makeText(getApplication(), "数据库中没有数据!", Toast.LENGTH_SHORT)
.show();
return;
}
for (int i = 0; i < AgModels.length; i++) {
list.add(AgModels[i].Typename);
}
}
@Override
public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
// TODO Auto-generated method stub
}
}
6.其他团队
1.洪居兴组
这一组的项目是针对西北各个旅游景点做详细的介绍,能够查找相应的旅游攻略,也能够发布消息。优点是可以实现登录与注册,各功能基本完善,界面也比较精美。缺点是对一些注册信息没有用正则表达式进行验证,填写信息可能不规范。如果是我来领导项目的话,我会更加注重注册个人信息的填写时的规范,然后再对项目的其他需求进行编写以及完善。
2.尹康杰组
这一组制作的是一个游戏app,是大多数人都没太注意到的app,很有创意,app实现的功能为进入开始页面后跳转到开始游戏界面,在界面的右上角,你可以选择开关游戏的背景音乐。屏幕的中间有个开始游戏的按钮,点击跳转到游戏界面,可以在界拖动红色小球移动,机掉落石头,在屏幕的两侧,会出现滚动的木头。完成度比较高,运行起来也流畅,问题是屏幕掉落物体时会偶尔卡顿,而且操作的红球显示优先级太高会遮挡住其他按钮。
3.李怡龙组
这一组制作的是一个队时效性有非常高要求的网络连接app,并且分为pc部分与安卓部分,涉及到了很多没有学过的只是,工作量与难度都相当大,可见下了很大的功夫,实现的功能为对局域网的连接与各种设置。缺点是该app在某些情况下会出现不明闪退,有待优化。如果是我来领导项目的话,我会先将app的闪退问题解决,然后再对项目的其他需求进行完善。
4.邢路组
这一组制作的是一个求职app,实现的功能为两种用户的登录与’注册,以及招聘信息的发布与管理即对数据库的增删改查操作。优点是app很符合市场需求,项目完成的话会是一个很实用的app,ui设计也比较美观,不会让人看起来觉得别扭。缺点为app的功能还不完善,对比同类求职app还有很多欠缺。如果是我来领导项目的话,我会再增加一个管理员登录,实现对求职者和招聘者的管理。
5.季澈组
这一组制作的是一个音乐播放器app,制作这种app的小组还有很多,但之所以选这组是因为他们的功能较为完善,不仅实现了基础的几种功能,还在此之上实现了歌词显示与随播放进度切换歌词的功能,界面设计也比较美观。缺点是单曲循环偶尔不会起作用,会直接播放下一首。。如果是我来领导项目的话,我会再增加一个搜索歌曲的功能,这样会让项目更加贴合实际。
7.遇到的问题:
翟伟朋,1500802085,在做项目的过程中遇到的问题有:
(1)跳转页面时总是已结束,解决方法是:在写intent .时在.前面多打了一个空格应写成intent.,
(2)在给日程设置日期时不知如何对日期进行获取,解决方法是:经查阅资料,了解到android有Calendar类,只需对其进行操作即可.
潘红瑞,1500802083,在做项目的过程中遇到的问题有:
(1)点击删除按钮时数据库并不会删除数据 。解决方法是:删除语句写得有错误,已改正;
(2)ListView显示内容时出现了问题;解决方法是:适配器写得有错误,已改正;
赵彦卓,1600802104,在做项目的过程中遇到的问题有:
(1)在向数据库传数据时不成功;解决方法是:数据库插入语句不正确,已改正;
(2)编辑button点击事件时部分按钮有问题;解决方法是:函数之间的调用出现了问题,已改正
8.团队分工:
姓名 | 分工 | 工作比例 | 分数(10分) |
---|---|---|---|
翟伟朋 | 数据库,UI | 45% | 9 |
潘红瑞 | 数据库,UI | 30% | 8 |
赵彦卓 | 数据库,UI | 25% | 9 |