Android 第四次作業
一、團隊成員:
段嗣躍:https://www.cnblogs.com/duansiyue/
陳素偉:https://www.cnblogs.com/aX-qhu/
二、APK連結:
https://coding.net/u/aX_qhu/p/AndroidLastWork/git/blob/master/app/release/app-release.apk 三、程式碼地址: https://git.coding.net/aX_qhu/AndroidLastWork.git四、團隊專案介紹
4.1專案截圖:
1.登入註冊介面
2.短訊息介面
3.資訊釋出介面
4.主介面
4.2 實現功能及其具體程式碼:
摘要:我們小組本次實現的專案為二手交易平臺,使用者登陸後可將自己閒置物品的照片,具體描述及期望價格上傳供他人觀看。
由於時間以及技術要求等問題,此次專案為單機版,使用者的物品詳情及物品照片全部儲存到了本地資料庫中,之後主頁內容由資料庫內容讀取而來。
使用說明:該軟體的正常使用需手動為其新增訪問儲存的許可權
五、專案實現的關鍵程式碼:
資料庫搭建:
privateDatabasefinal 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; }Post
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 }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:
由於時間關係,該板塊未進行整理
七:團隊在專案進行中產生的問題及解決方案:
陳素偉: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 |