Android 第四次作业
一、团队成员:
段嗣跃: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); }
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; }
5.图片及文本读取:
1 photoImage.setImageURI(Uri.parse(imageUrl)); 2 ViewGroup.LayoutParams params2 = new LinearLayout.LayoutParams(220, 220); 3 4 photoImage.setLayoutParams(params2); 5 linearLayouts[1].addView(photoImage); 6 7 LinearLayout text = new LinearLayout(content); 8 text.setOrientation(LinearLayout.VERTICAL); 9 TextView contentText = new TextView(content, null, R.style.ThingsText1); 10 ViewGroup.LayoutParams params3 = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); 11 contentText.setText(content1); 12 ((LinearLayout.LayoutParams) params3).setMarginStart(20); 13 contentText.setLayoutParams(params3); 14 15 TextView priceText = new TextView(content, null, R.style.ThingsText1); 16 ViewGroup.LayoutParams params4 = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT); 17 priceText.setText("¥" + price); 18 priceText.setTextColor(Color.parseColor("#FF0000")); 19 priceText.setGravity(Gravity.BOTTOM); 20 ((LinearLayout.LayoutParams) params4).setMarginStart(20); 21 priceText.setLayoutParams(params4); 22 23 text.addView(contentText); 24 text.addView(priceText); 25 linearLayouts[1].addView(text); 26 if (!TextUtils.isEmpty(title) && title.equals("我买到的")) { 27 ViewGroup.LayoutParams params5 = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); 28 TextView pText = new TextView(content); 29 pText.setText("实付款: ¥" + price); 30 pText.setTextAlignment(TextView.TEXT_ALIGNMENT_TEXT_END); 31 pText.setLayoutParams(params5); 32 pText.setPadding(0, 0, padding, 0); 33 linearLayouts[2].addView(pText); 34 } 35 linearLayout.addView(linearLayouts[0]); 36 linearLayout.addView(linearLayouts[1]); 37 linearLayout.addView(linearLayouts[2]); 38 linearLayout.setOnClickListener(new View.OnClickListener() { 39 @Override 40 public void onClick(View v) { 41 Intent intent = new Intent(content, DetailActivity.class); 42 intent.putExtra("name", name); 43 intent.putExtra("price", price); 44 intent.putExtra("content", content1); 45 intent.putExtra("imageUrl", imageUrl); 46 intent.putExtra("id", id); 47 content.startActivity(intent); 48 } 49 }); 50 mainLayout.addView(linearLayout); 51 } 52 return n; 53 }
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; }
六、运行其他团队项目的APK:
1.吕晓皎组:
优点:可以查看单词,词性,意思等。可以搜索单词,查看攻略、学习进度等
缺点:界面不够美观
改进:优化界面,使界面更加任性话会更好
2.许宇伟组:
优点:一个简单的小游戏,界面简单易懂,规则也不复杂,使用户的目的明确等
缺点:没有提示分数、等级等相关信息的文字
改进:可以适当增加一些文字来提示用户当前分数、已经游戏时间等,使用户更加清晰的了解认识到当前的分数和已经游戏的时间,更好的话可以加个分享功能
3.尹康杰组:
优点:一个简单的小游戏,操作简单,适合作为闲暇时的消遣工具
缺点:卡顿现象较为明显,且游戏背景对视觉的干扰较大
改进:适当降低屏幕分辨率,更改背景,并可为自己的主角更换多种皮肤增加新鲜感
4.李长栋组:
优点:功能有点名、考试、练习等,能够方便老师教学,节省时间,从而有更多的上课时间。界面简洁
缺点:用户界面并不太好看,字体、背景等不适合所有用户
改进:能有用户自定义字体,背景等会更加美观
5.盖星辰组
优点:界面美观,较为流畅,操作简单对新手友好,且有背景音乐
缺点:结束界面过于简单,人物与踏板接触不完美,且如果人物会随着踏板移动而移动会更好
七:团队在项目进行中产生的问题及解决方案:
陈素伟:1600802074问题:
(Fragment already active)
解决方法:跳转到登录页面的时候把主页面finish了
登录成功后跳到主页面相当于重新new一个fragment
2.对物品进行收藏时的重复显示问题:
解决方法:代码逻辑错误,重新调整了思路
段嗣跃:1600802076问题及解决方法
1.数据库中图片的存储问题:
解决方法:之前试了将图片转化为byte数组存储在数据库中的Blob类型中,但遇到了种种错误,后来调整思路直接调用相册保存图片路径,在数据库中进行保存。
2.调用相机或相册图片的页面显示问题:
在相册中选择的图片放到界面上会出现显示不规则,这里通过查阅资料对图片进行了适当的裁剪
八、团队成员分工:
姓名 | 分工 | 工作比例 | 分数(10分) |
陈素伟 | 数据库,UI,项目提交 | 60% | 6 |
段嗣跃 | 数据库,UI,博客编写 | 40% | 4 |
九、项目演示视频: