一、团队成员:

段嗣跃:https://www.cnblogs.com/duansiyue/

陈素伟:https://www.cnblogs.com/aX-qhu/

二、APK链接:

三、代码地址:

四、团队项目介绍

4.1项目截图:

  1.登录注册界面

  2.短消息界面

  3.信息发布界面

  4.主界面

4.2 实现功能及其具体代码:

摘要:我们小组本次实现的项目为二手交易平台,用户登陆后可将自己闲置物品的照片,具体描述及期望价格上传供他人观看。

由于时间以及技术要求等问题,此次项目为单机版,用户的物品详情及物品照片全部储存到了本地数据库中,之后主页内容由数据库内容读取而来。

使用说明:该软件的正常使用需手动为其添加访问存储的权限

五、项目实现的关键代码:

数据库搭建:

 private final static String DATABASE = "my";

    /*******用户表******/
public final static String USERS_TAbLE = "users"; /*******物品表******/
public final static String INFO_TAbLE = "info"; private final static int VERSION = 1;
public DataBase(Context context) {
super(context, DATABASE, null, VERSION);
} @Override
public void onCreate(SQLiteDatabase db) {
String users = "create table " + USERS_TAbLE + " (id integer primary key, name varchar, account varchar, password varchar)";
String info = "create table " + INFO_TAbLE + " (id integer primary key, content varchar, imageUrl varchar, price decimal, name varchar, post integer, buy integer, collection integer)";
db.execSQL(users);
db.execSQL(info);
}

Database

1.登录注册

(保存用户登录信息,完善发布信息)

  public void onClick(View v) {
switch (v.getId()) {
case R.id.login :
Cursor cursor = writableDatabase.rawQuery("select * from "+ DataBase.USERS_TAbLE + " where account=?", new String[]{accountText.getText().toString()}); if (cursor.moveToFirst()) {
if (cursor.getString(3).equals(passText.getText().toString())) {
Toast.makeText(getApplicationContext(), "登录成功", Toast.LENGTH_SHORT).show();
String name = cursor.getString(1);
((MyApplication) getApplication()).setName(name);
Intent intent = new Intent(this, MainActivity.class);
intent.putExtra("name", name);
intent.putExtra("position", 3);
startActivity(intent);
finish();
} else {
Toast.makeText(getApplicationContext(), "账号密码不匹配", Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(getApplicationContext(), "用户不存在", Toast.LENGTH_SHORT).show();
}
break;
case R.id.register :
startActivity(new Intent(this, RegisterActivity.class));
break;
}
} @Override
protected void onNewIntent(Intent intent) {
String account = intent.getStringExtra("account");
String pass = intent.getStringExtra("pass");
if (!TextUtils.isEmpty(account) && !TextUtils.isEmpty(pass)) {
accountText.setText(account);
passText.setText(pass);
}
super.onNewIntent(intent);
}

2.登录状态检测

(用户进入软件后的一切发布购买操作均需在登录的前提下进行,否则会提示未登录)

        if (TextUtils.isEmpty(name)) {
Toast.makeText(v.getContext(), "请先登陆", Toast.LENGTH_SHORT).show();
intent.setClass(v.getContext(), Login.class);
startActivity(intent);
return;
}

3.本地相册读取

(添加权限读取本地相册图片并保存路径)

4.图片及文本上传:

    public void onClick(View v) {
switch (v.getId()) {
case R.id.im1 :
case R.id.tv1 :
Intent intent = new Intent(Intent.ACTION_GET_CONTENT, MediaStore.Audio.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, 1);
break;
case R.id.postButton :
String name = ((MyApplication) getActivity().getApplication()).getName();
if (TextUtils.isEmpty(name)) {
Toast.makeText(v.getContext(), "未登录", Toast.LENGTH_SHORT).show();
return;
}
if (TextUtils.isEmpty(uriString)) {
Toast.makeText(v.getContext(), "请选择图片", Toast.LENGTH_SHORT).show();
} else {
String content = contentText.getText().toString();
String price = priceText.getText().toString();
if (TextUtils.isEmpty(content) || TextUtils.isEmpty(price)) {
Toast.makeText(v.getContext(), "信息填写不完整", Toast.LENGTH_SHORT).show();
return;
}
if (Integer.valueOf(price) <= 0) {
Toast.makeText(v.getContext(), "价格错误", Toast.LENGTH_SHORT).show();
return;
} if (post(name, content, price, uriString)) {
Toast.makeText(v.getContext(), "发布成功", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(v.getContext(), "发布失败", Toast.LENGTH_SHORT).show();
}
}
break;
}
} @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1 && resultCode == RESULT_OK) {
uriString = data.getDataString();
im1.setImageURI(data.getData());
}
super.onActivityResult(requestCode, resultCode, data);
} private boolean post (String name, String content, String price, String uri) {
SQLiteDatabase database = ((MyApplication) getActivity().getApplication()).getDataBase().getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", name);
values.put("id", (int) (Math.random() * 1000));
values.put("content", content);
values.put("price", price);
values.put("imageUrl", uri);
values.put("post", 1);
values.put("buy", 0);
values.put("collection", 0);
return database.insert(DataBase.INFO_TAbLE, null, values) > 0;
}

Post

5.图片及文本读取:

   photoImage.setImageURI(Uri.parse(imageUrl));
ViewGroup.LayoutParams params2 = new LinearLayout.LayoutParams(220, 220); photoImage.setLayoutParams(params2);
linearLayouts[1].addView(photoImage); LinearLayout text = new LinearLayout(content);
text.setOrientation(LinearLayout.VERTICAL);
TextView contentText = new TextView(content, null, R.style.ThingsText1);
ViewGroup.LayoutParams params3 = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
contentText.setText(content1);
((LinearLayout.LayoutParams) params3).setMarginStart(20);
contentText.setLayoutParams(params3); TextView priceText = new TextView(content, null, R.style.ThingsText1);
ViewGroup.LayoutParams params4 = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT);
priceText.setText("¥" + price);
priceText.setTextColor(Color.parseColor("#FF0000"));
priceText.setGravity(Gravity.BOTTOM);
((LinearLayout.LayoutParams) params4).setMarginStart(20);
priceText.setLayoutParams(params4); text.addView(contentText);
text.addView(priceText);
linearLayouts[1].addView(text);
if (!TextUtils.isEmpty(title) && title.equals("我买到的")) {
ViewGroup.LayoutParams params5 = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
TextView pText = new TextView(content);
pText.setText("实付款: ¥" + price);
pText.setTextAlignment(TextView.TEXT_ALIGNMENT_TEXT_END);
pText.setLayoutParams(params5);
pText.setPadding(0, 0, padding, 0);
linearLayouts[2].addView(pText);
}
linearLayout.addView(linearLayouts[0]);
linearLayout.addView(linearLayouts[1]);
linearLayout.addView(linearLayouts[2]);
linearLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(content, DetailActivity.class);
intent.putExtra("name", name);
intent.putExtra("price", price);
intent.putExtra("content", content1);
intent.putExtra("imageUrl", imageUrl);
intent.putExtra("id", id);
content.startActivity(intent);
}
});
mainLayout.addView(linearLayout);
}
return n;
}

Image

6.下拉刷新

7.物品状态更改

(点击收藏按钮会改变数据库中状态一栏的值,便于收藏页面的读取)

  private boolean isCollection () {
Cursor cursor = database.rawQuery("select * from " + DataBase.INFO_TAbLE + " where id=" + id, null);
if (cursor.moveToFirst()) {
isCollection = cursor.getInt(cursor.getColumnIndex("collection")) == 1;
return isCollection;
}
return false;
} private void setCollectionButton() {
collectionButton.setText(isCollection() ? "已收藏" : "收藏");
} private boolean setCollection(int i) {
ContentValues values = new ContentValues();
values.put("collection", i);
int j = database.update(DataBase.INFO_TAbLE, values, "id=?", new String[]{id});
return j > 0;
}

Collection

六、运行其他团队项目的APK:

1.吕晓皎组:

优点:可以查看单词,词性,意思等。可以搜索单词,查看攻略、学习进度等

缺点:界面不够美观

改进:优化界面,使界面更加任性话会更好

2.许宇伟组:

优点:一个简单的小游戏,界面简单易懂,规则也不复杂,使用户的目的明确等

缺点:没有提示分数、等级等相关信息的文字

改进:可以适当增加一些文字来提示用户当前分数、已经游戏时间等,使用户更加清晰的了解认识到当前的分数和已经游戏的时间,更好的话可以加个分享功能

3.尹康杰组:

优点:一个简单的小游戏,操作简单,适合作为闲暇时的消遣工具

缺点:卡顿现象较为明显,且游戏背景对视觉的干扰较大

改进:适当降低屏幕分辨率,更改背景,并可为自己的主角更换多种皮肤增加新鲜感

4.李长栋组:

优点:功能有点名、考试、练习等,能够方便老师教学,节省时间,从而有更多的上课时间。界面简洁

缺点:用户界面并不太好看,字体、背景等不适合所有用户

改进:能有用户自定义字体,背景等会更加美观

5.盖星辰组

优点:界面美观,较为流畅,操作简单对新手友好,且有背景音乐

缺点:结束界面过于简单,人物与踏板接触不完美,且如果人物会随着踏板移动而移动会更好

七:团队在项目进行中产生的问题及解决方案:

陈素伟:1600802074问题:

1.登录时的应用闪退问题。发现Fragment被隐藏后,不能在使用setArguments()传递,否则就会报java.lang.IllegalStateException java.lang.IllegalStateException: Fragment already active异常主要是使用setArguments()传递参数导致的 

(Fragment already active)

解决方法:跳转到登录页面的时候把主页面finish了

登录成功后跳到主页面相当于重新new一个fragment

2.对物品进行收藏时的重复显示问题

解决方法:代码逻辑错误,重新调整了思路

段嗣跃:1600802076问题及解决方法

1.数据库中图片的存储问题:

解决方法:之前试了将图片转化为byte数组存储在数据库中的Blob类型中,但遇到了种种错误,后来调整思路直接调用相册保存图片路径,在数据库中进行保存。

2.调用相机或相册图片的页面显示问题:

在相册中选择的图片放到界面上会出现显示不规则,这里通过查阅资料对图片进行了适当的裁剪

八、团队成员分工:

姓名 分工   工作比例   分数(10分)
陈素伟 数据库,UI,项目提交 60% 6  
段嗣跃 数据库,UI,博客编写 40% 4

九、项目演示视频:

优酷链接

Android 第四次作业的更多相关文章

  1. Android第四次作业

    一.团队成员 成员1:刘宇莹 学号:1600802122 班级:计算机164 博客链接:刘宇莹 成员2:孟鑫菲 学号:1600802092 班级:计算机163 博客链接:孟鑫菲 二.团队项目apk 拍 ...

  2. 耿丹CS16-2班第四次作业汇总

    Deadline: 2016-10-13 12:00 作业内容 实验3-1 分别使用while循环.do while循环.for循环求1+2+3+ --+100. 实验3-2 分别使用while循环. ...

  3. 第四次作业——WORDSEARCH小游戏

    “谁想出来的这么缺德的题目啊!!!!”一个声音在我心中回荡 这个题目很早就在课堂上公布了,我和我的小伙伴都惊呆了! 这是个毛?根本无从下手的感觉 总是觉得这个小游戏不是程序能给出答案的,因为我的第一印 ...

  4. 【转】Android LCD(四):LCD驱动调试篇

    关键词:android LCD TFTSN75LVDS83B  TTL-LVDS LCD电压背光电压 平台信息:内核:linux2.6/linux3.0系统:android/android4.0 平台 ...

  5. 【转】android camera(四):camera 驱动 GT2005

    关键词:android  camera CMM 模组 camera参数  GT2005 摄像头常见问题 平台信息: 内核:linux系统:android 平台:S5PV310(samsung exyn ...

  6. 网络1711班 C语言第四次作业批改总结

    网络1711班 C语言第四次作业批改总结 助教有话说(写在前面) 近来,有同学跟老师和助教们反映:博客作业太多太麻烦,而且对编程能力提高似乎没什么帮助?在这里我要谈一谈我的感想. 博客作业的意义? 首 ...

  7. 第四次作业之oop

    第四次作业 四则运算 类 输入类:用户输入题数和答案,语言选择. 生成类:随机数字,运算符,生成表达式. 读取类:读取表达式,计算正确答案. 界面类:选择语言,输出正确题数和答案. 类与类之间是如何进 ...

  8. C#基础第四天-作业答案-Hashtable-list<KeyValuePair>泛型实现名片

    .Hashtable 实现 Hashtable table = new Hashtable(); while (true) { Console.WriteLine("------------ ...

  9. C#基础第四天-作业-Hashtable-list<KeyValuePair>泛型实现名片

    1.名片集: 名片集实现功能:不限定集合实现 增加,查询,查询全部,删除 功能,需求条件: 根据姓名去(查询/删除)某一行数据.指定:姓名,年龄,性别,爱好,联系方式. 采用技术:Hashtable- ...

随机推荐

  1. 命令链接按钮QCommandLinkButton

    继承QPushButton 它的用途类似于单选按钮的用途,因为它用于在一组互斥选项之间进行选择,命令链接按钮不应单独使用,而应作为向导和对话框中单选按钮的替代选项,外观通常类似于平面按钮的外观,但除了 ...

  2. 迅为IMX6Q PLUS开发板烧写Android6.0系统方法

    平台:迅为IMX6Q PLUS开发板工具:MfgTool2 工具 镜像文件在光盘目录“03 镜像_android 6.0.1 文件系统”下.其中商业级核心板为 2G内存镜像,工业级核心板为 1G 内存 ...

  3. SW:HTML DOM

    1:节点:nodeType,nodeValue,nodeName getAttributeNode() 方法从当前元素中通过名称获取属性节点. 元素节点nodeValue是null,属性节点nodeV ...

  4. 2018-2019-2 20165221『网络对抗技术』Exp4:恶意代码分析

    2018-2019-2 20165221『网络对抗技术』Exp4:恶意代码分析 实验要求: 是监控你自己系统的运行状态,看有没有可疑的程序在运行. 是分析一个恶意软件,就分析Exp2或Exp3中生成后 ...

  5. Interface Comparable<T>

    Interface Comparable<T> : 该接口对实现它的每个类的对象强加一个整体排序. 这个排序被称为类的自然排序 ,类的compareTo方法被称为其自然比较方法 . 参数 ...

  6. 2018-2019-2 20165231《网络对抗技术》Exp0 Kali安装 Week1

    下载Kali Linux系统 进入官网进入下载页面,因为我们是在虚拟机内使用,而官网已经为我们提供了VM版的所以我就直接下载了这个版本的. 根据官网提示使用管理员帐号root(密码为toor)登录,创 ...

  7. 正则表达式匹配日期,支持闰年,格式为YYYYMMDD

    年份:[\d]{4} 带31的月份:(0[13578]|1[02])((0[1-9])|([12][0-9])|(3[01])) 非2月不带31日的月份:((0[469])|11)((0[1-9])| ...

  8. vue中数据添加完成以后,数据回显

    1.格式 <FormItem label="奖品领取类型:" prop="getType" > <RadioGroup v-model=&qu ...

  9. (转)Java语法----Java中equals和==的区别

    转载地址:https://www.cnblogs.com/smyhvae/p/3929585.html 一.java当中的数据类型和“==”的含义: 基本数据类型(也称原始数据类型) :byte,sh ...

  10. java 冒泡排序 day003

    一.冒泡排序: 利用冒泡排序对数组进行排序 二.基本概念: 依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后.然后比较第2个数和第3个数, ...