第三周(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在我们的努力下也正在慢慢成型,我们都会更加努力。




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值