第三週(2) app詳細頁面設計與代碼編寫

引言

這周前半部分的工作我們主要對頁面進行了初步設計,也實現了一些功能代碼,後半部分在頁面方面進行了進一步的詳細設計,並且編寫了其他功能代碼,總結一下工作目錄:
  • 頁面詳細設計與所有頁面基本完成
  • 客戶端代碼編寫
  • 後臺代碼編寫

這裏我主要針對我這兩天進行的工作:添加好友功能進行介紹。


添加好友

添加好友流程如下:

  1. 搜索用戶id
  2. 搜索到用戶後,輸入驗證信息
  3. 輸入備註,發送添加請求,附帶驗證信息,等待回覆

所以需要三個界面,搜索界面,驗證信息界面,發送界面

1、搜索界面

界面如下所示:


在搜索框中輸入用戶id或者手機號,點擊搜索按鈕,即可進行用戶搜索。

搜索流程如下:

  1. 檢查網絡是否可用
  2. 根據輸入的數據長度判斷是手機號還是id
  3. 發送http請求,等待後臺回覆
  4. 若有該用戶,則跳轉驗證信息界面
  5. 若無該用戶,則顯示不存在

編碼如下:

package com.example.sdu.myflag.activity;

import android.content.Intent;
import android.os.Bundle;
import android.util.TypedValue;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.SearchView;
import android.widget.SearchView.OnQueryTextListener;
import android.widget.TextView;
import android.widget.Toast;

import com.example.sdu.myflag.base.BaseActivity;
import com.example.sdu.myflag.R;
import com.example.sdu.myflag.util.BaseTools;
import com.example.sdu.myflag.util.NetUtil;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;
import java.util.LinkedList;
import java.util.List;

import okhttp3.Response;


public class SearchFriendActivity extends BaseActivity implements SearchView.OnQueryTextListener {
    private SearchView sv;
    private TextView empty_layout;
    String user;

    @Override
    public int getLayoutId() {
        return R.layout.activity_searchfriend;
    }

    @Override
    public void afterCreate(Bundle savedInstanceState) {
        init();
        sv.setOnQueryTextListener(this);
    }

    private void init() {
        sv = (SearchView) findViewById(R.id.searchView);
        empty_layout = (TextView) findViewById(R.id.no_user_tv);
        int tv_id = sv.getContext().getResources().getIdentifier("android:id/search_src_text", null, null);
        TextView tv = (TextView) sv.findViewById(tv_id);
        tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14);
    }

    private void searchFriend(String str) {
        if (!BaseTools.isNetworkAvailable(SearchFriendActivity.this)) {
            Toast.makeText(SearchFriendActivity.this, "當前網絡不可用!", Toast.LENGTH_LONG).show();
            return;
        }

        SearchFriendResult searchFriendResult = new SearchFriendResult();
        List<NetUtil.Param> params = new LinkedList<NetUtil.Param>();

        if (str.length() == 11) { // 手機號
            params.add(new NetUtil.Param("phone", str));
        } else { // id
            params.add(new NetUtil.Param("id", str));
        }

        try {
            NetUtil.getResult(NetUtil.findUserUrl, params, searchFriendResult);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public boolean onQueryTextSubmit(String query) {
        searchFriend(query);
        return false;
    }

    @Override
    public boolean onQueryTextChange(String newText) {
        return false;
    }

    private class SearchFriendResult implements NetUtil.CallBackForResult {

        @Override
        public void onFailure(final IOException e) {
            SearchFriendActivity.this.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(SearchFriendActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
                }
            });
        }

        @Override
        public void onSuccess(Response response) {
            if (response.isSuccessful()) {
                try {
                    JSONObject jsonObject = new JSONObject(response.body().string());
                    user = jsonObject.getString("user");
                    JSONObject userObj = jsonObject.getJSONObject("user");
                    int uid = userObj.getInt("uid");
                    if (uid == 0) {
                        SearchFriendActivity.this.runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                empty_layout.setVisibility(View.VISIBLE);
                            }
                        });
                    } else {
                        //查找成功,跳轉到添加界面
                        //json解析在添加界面進行
                        SearchFriendActivity.this.runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                empty_layout.setVisibility(View.GONE);
                                Intent intent = new Intent();
                                intent.setClass(SearchFriendActivity.this, AddFriendMessageActivity.class);
                                intent.putExtra("user", user);
                                startActivity(intent);
                            }
                        });
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
    }

    public void searchFriendBack(View view){
        this.finish();
    }
}

2、驗證信息界面

界面如圖:


界面邏輯十分簡單,只要輸入驗證信息,點擊下一步按鈕即可,驗證信息會被加入Intent,傳遞到發送界面,不涉及任何網絡請求。

編碼如下:

package com.example.sdu.myflag.activity;

import android.content.Intent;
import android.database.CursorJoiner;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import com.example.sdu.myflag.base.BaseActivity;
import com.example.sdu.myflag.R;

public class AddFriendMessageActivity extends BaseActivity {
    private Button next;
    private EditText editText;
    private Bundle bundle;

    @Override
    public int getLayoutId() {
        return R.layout.activity_addfriendmessage;
    }

    @Override
    public void afterCreate(Bundle savedInstanceState) {
        init();
        setListener();
    }

    private void init(){
        next = (Button) findViewById(R.id.messageNextButton);
        editText = (EditText) findViewById(R.id.messageEditText);
        bundle = this.getIntent().getExtras();
    }

    private void setListener() {
        next.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String message = editText.getText().toString();
                String user = bundle.getString("user");
                Intent intent = new Intent(AddFriendMessageActivity.this, AddFriendActivity.class);
                intent.putExtra("message", message);
                intent.putExtra("user", user);
                startActivityForResult(intent, 0);
            }
        });
    }

    public void friendMsgBack(View view){
        this.finish();
    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (resultCode){
            case RESULT_OK:
                AddFriendMessageActivity.this.finish();
        }
    }
}


3、發送界面

界面如下:

界面上顯示的信息有:搜索到的用戶頭像、用戶名,驗證信息,界面需要輸入對用戶的備註,用戶信息確認無誤,並且備註填好後,點擊右上角發送按鈕即可發送好友請求,用戶的信息以及驗證信息都是從前面的界面通過Intent中的Bundle傳遞過來。

發送界面具體邏輯如下:

  1. 判斷網絡是否可用
  2. 網絡可用,則判斷是否備註輸入合法
  3. 點擊發送,按照後臺要求參數格式發送好友請求
  4. 若發送成功,則回到搜索用戶界面
  5. 若發送失敗,則彈框

根據邏輯編碼如下:

package com.example.sdu.myflag.activity;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.example.sdu.myflag.R;
import com.example.sdu.myflag.base.BaseActivity;
import com.example.sdu.myflag.base.BaseApplication;
import com.example.sdu.myflag.util.BaseTools;
import com.example.sdu.myflag.util.NetUtil;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import okhttp3.Response;

public class AddFriendActivity extends BaseActivity {
    private String user, friendId, message;
    private Button sendButton;
    private EditText remarkEditText;
    private TextView nameTextView, informationTextView;
    private ImageView icon_img;
    Intent mIntent;

    @Override
    public int getLayoutId() {
        return R.layout.activity_addfriend;
    }

    @Override
    public void afterCreate(Bundle savedInstanceState) {
        init();
        getJson();
        setListener();
    }

    private void init() {
        sendButton = (Button) findViewById(R.id.addFriendSendButton);
        nameTextView = (TextView) findViewById(R.id.addFriendNameTextView);
        informationTextView = (TextView) findViewById(R.id.addFriendInformationTextView);
        remarkEditText = (EditText) findViewById(R.id.addFriendRemarkEditText);
        icon_img = (ImageView) findViewById(R.id.icon_img);

        mIntent = getIntent();
        Bundle bundle = mIntent.getExtras();
        user = bundle.getString("user");
        message = bundle.getString("message");
    }

    private void getJson() {
        try {
            JSONObject userJson = new JSONObject(user);
            int iconId = userJson.optInt("photo");
            friendId = userJson.optInt("uid") + "";
            String friendName = userJson.optString("nickname");

            icon_img.setImageDrawable(getResources().getDrawable(BaseApplication.HeadIcon[iconId]));
            if (friendName != null) {
                nameTextView.setText(friendName);
            }

            if (message != null) {
                informationTextView.setText(message);
            }

        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    private void setListener() {

        sendButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (!BaseTools.isNetworkAvailable(AddFriendActivity.this)) {
                    Toast.makeText(AddFriendActivity.this, "當前網絡不可用!", Toast.LENGTH_LONG).show();
                    return;
                }

                String remark = remarkEditText.getText().toString();
                AddFriendResult addFriendResult = new AddFriendResult();
                List<NetUtil.Param> params = new ArrayList<>();

                SharedPreferences sharedPreferences = BaseApplication.getInstance().getSharedPreferences("User", Context.MODE_PRIVATE);
                String requestId = sharedPreferences.getString("uid", null);
                if (requestId == null) {
                    Toast.makeText(AddFriendActivity.this, "獲取用戶ID失敗!", Toast.LENGTH_SHORT).show();
                    return;
                }

                if (friendId == null) {
                    Toast.makeText(AddFriendActivity.this, "獲取好友ID失敗!", Toast.LENGTH_SHORT).show();
                    return;
                }

                params.add(new NetUtil.Param("id", friendId));
                params.add(new NetUtil.Param("requestId", requestId));
                params.add(new NetUtil.Param("message", message));
                params.add(new NetUtil.Param("remark", remark));

                try {
                    NetUtil.getResult(NetUtil.addFriendUrl, params, addFriendResult);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    private class AddFriendResult implements NetUtil.CallBackForResult {
        @Override
        public void onFailure(final IOException e) {
            AddFriendActivity.this.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(AddFriendActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
                }
            });
        }

        @Override
        public void onSuccess(Response response) {
            if (response.isSuccessful()) {
                AddFriendActivity.this.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(AddFriendActivity.this, "請求發送成功!", Toast.LENGTH_LONG).show();
                        setResult(RESULT_OK, mIntent);
                        AddFriendActivity.this.finish();
                    }
                });
            }
        }
    }

    public void addFriendBack(View view) {
        setResult(RESULT_CANCELED, mIntent);
        this.finish();
    }
}

4、測試

我的這一塊功能的測試工作由朱宏進行,針對每一個界面的邏輯設計多組測試用例,在真機和虛擬機上分別進行測試,直到測試全部通過。


總結

本週的工作告一段落,整體來說功能實現的不錯,下週要繼續編碼工作,app在我們的努力下也正在慢慢成型,我們都會更加努力。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章