1. 程式人生 > >Android 第四次作業

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 實現功能及其具體程式碼:

 

摘要:我們小組本次實現的專案為二手交易平臺,使用者登陸後可將自己閒置物品的照片,具體描述及期望價格上傳供他人觀看。

由於時間以及技術要求等問題,此次專案為單機版,使用者的物品詳情及物品照片全部儲存到了本地資料庫中,之後主頁內容由資料庫內容讀取而來。

使用說明:該軟體的正常使用需手動為其新增訪問儲存的許可權

五、專案實現的關鍵程式碼:

資料庫搭建:

 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.圖片及文字讀取:

 

 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