0
0
فهرست منبع

author:wcq
update:字母键盘提交

wcq 3 سال پیش
والد
کامیت
cf608fb445

+ 1019 - 0
app/src/main/java/com/emato/ich/fragment/InputInfoKeyBoardFragment.java

@@ -0,0 +1,1019 @@
+package com.emato.ich.fragment;
+
+import android.os.Bundle;
+import android.os.CountDownTimer;
+import android.text.Editable;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+import com.cherry.sdk.controller.utils.ScanGunKeyEventHelper;
+import com.emato.ich.MainActivity;
+import com.emato.ich.R;
+import com.emato.ich.api.ICSPClient;
+import com.emato.ich.contant.ICSPConstant;
+import com.emato.ich.contant.ScanGunConstant;
+import com.emato.ich.databinding.FragmentInputKeyBoardBinding;
+import com.emato.ich.databinding.FragmentMyKeyBoardBinding;
+import com.emato.ich.entity.vo.PreparedOrderResponseVo;
+import com.emato.ich.entity.vo.PreparedOrderVo;
+import com.emato.ich.entity.vo.ResponseData;
+import com.emato.ich.local.LocalStorage;
+import com.emato.ich.utils.BaseUtils;
+import com.emato.ich.utils.JacksonUtils;
+import com.emato.ich.utils.Log;
+import com.emato.ich.utils.LoggingUtils;
+import com.emato.ich.utils.NavUtils;
+import com.emato.ich.utils.StringUtils;
+import com.emato.ich.utils.TimeOutUtils;
+import com.emato.ich.utils.ToastUtils;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import org.jetbrains.annotations.NotNull;
+
+import java.io.IOException;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import okhttp3.Call;
+import okhttp3.Callback;
+import okhttp3.Response;
+
+/**
+ * 输入投递信息
+ */
+public class InputInfoKeyBoardFragment extends Fragment {
+
+    private static final String TAG = "InputInfoFragment";
+    private FragmentInputKeyBoardBinding binding;
+    private PreparedOrderResponseVo data;
+    private final AtomicInteger mailNoLock = new AtomicInteger(1);
+    private final AtomicInteger submitLock = new AtomicInteger(1);
+    private CountDownTimer timer;
+    private long start;
+
+    @Nullable
+    @org.jetbrains.annotations.Nullable
+    @Override
+    public View onCreateView(@NonNull @NotNull LayoutInflater inflater, @Nullable @org.jetbrains.annotations.Nullable ViewGroup container, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) {
+        start = System.currentTimeMillis();
+        binding = FragmentInputKeyBoardBinding.inflate(inflater, container, false);
+
+        return binding.getRoot();
+    }
+
+
+    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
+        long end = System.currentTimeMillis();
+        Log.i(TAG, TAG + "页面渲染速度为" + (end - start) + "ms。");
+//        BaseUtils.disableEditText(binding.delivererPhone);
+        BaseUtils.disableEditText(binding.delivererPhoneConfirm);
+        BaseUtils.disableEditText(binding.mailNo);
+
+        try {
+            MainActivity activity = (MainActivity) getActivity();
+            timer = TimeOutUtils.timeout(activity, InputInfoKeyBoardFragment.this, binding.timeout, 120);
+            timer.start();
+        } catch (Exception e) {
+            Log.e(TAG, "onViewCreated: 倒计时出现异常! ", e);
+            LoggingUtils.sendErrorLog("业务异常: 输入投递信息页面倒计时出现异常! ", e);
+        }
+
+        Bundle arguments = null;
+        String sectionType = null;
+        try {
+            MainActivity activity = (MainActivity) getActivity();
+            arguments = activity.getBundleMap().get(ChooseCabinetFragment.class.getName());
+            sectionType = arguments.getString("section_type");
+
+            // 扫描枪监听 扫描运单号
+            activity.scanGunKeyEventHelper = new ScanGunKeyEventHelper(s -> {
+                // 扫码成功回调
+                Log.d(TAG, "onScanSuccess: " + s);
+
+                if (!StringUtils.isNullOrEmpty(s)) {
+                    for (String pattern : ScanGunConstant.getPatterns()) {
+                        Matcher matcher = Pattern.compile(pattern).matcher(s);
+                        if (!matcher.matches()) {
+                            ToastUtils.make(getContext(), "请将条形码置于扫码枪前! ");
+                            return;
+                        }
+                    }
+                }
+
+                if (mailNoLock.get() == 1) {
+                    Editable text = binding.mailNo.getText();
+                    text.clear();
+                    binding.mailNo.setText(s);
+                    mailNoLock.incrementAndGet();
+                    // TODO 预定义,实际参数可能不一致 oms获取用户手机号 自动填充
+                    ICSPClient.getUserPhoneNumber(LocalStorage.getInstance().getSession().getToken(), BaseUtils.getClientId(), s, new Callback() {
+                        @Override
+                        public void onFailure(@NotNull Call call, @NotNull IOException e) {
+                            // 请求失败
+                            Log.e(TAG, "onFailure: 请求oms获取手机号失败! 网络异常! ", e);
+                            LoggingUtils.sendErrorLog("业务异常: 请求oms获取手机号失败! 网络异常! ", e);
+                            ToastUtils.make(getContext(), "服务器异常! 请手动输入!");
+                            mailNoLock.set(1);
+                        }
+
+                        @Override
+                        public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
+
+                            getActivity().runOnUiThread(() -> {
+                                String parseResponse = ICSPClient.isSuccessfulAndParseResponse(response);
+                                if (!StringUtils.isNullOrEmpty(parseResponse)) {
+                                    try {
+                                        ResponseData<PreparedOrderResponseVo> responseData = new ObjectMapper().readValue(parseResponse, new TypeReference<ResponseData<PreparedOrderResponseVo>>() {
+                                        });
+
+                                        PreparedOrderResponseVo data = responseData.getData();
+                                        if (null != responseData && ICSPConstant.OK.equals(responseData.getCode())) {
+                                            String collectorPhone = data.getCollectorPhone();
+                                            binding.delivererPhoneConfirm.setText(collectorPhone);
+                                        } else {
+                                            ToastUtils.make(getContext(), responseData.getMsg());
+                                        }
+
+                                    } catch (JsonProcessingException e) {
+                                        Log.e(TAG, "onResponse: 服务器响应错误! 自动获取用户手机号失败! ", e);
+                                        ToastUtils.make(getContext(), "网络异常! 请手动输入手机号! ");
+                                        LoggingUtils.sendErrorLog("业务异常: 服务器响应错误! 自动获取用户手机号失败! ", e);
+                                    } catch (RuntimeException e) {
+                                        Log.e(TAG, "onResponse: 获取用户手机号未知错误! ", e);
+                                        ToastUtils.make(getContext(), "未查询到手机号! 请手动输入! ");
+                                        LoggingUtils.sendErrorLog("业务异常: 获取用户手机号未知错误! ", e);
+                                    }
+                                } else {
+                                    ToastUtils.make(getContext(), "服务器异常!请稍后重试!");
+                                }
+                                mailNoLock.set(1);
+                            });
+
+                        }
+                    });
+                }
+            });
+
+        } catch (RuntimeException e) {
+            Log.e(TAG, "onViewCreated: InputInfoFragment页面获取ChooseCabinetFragment传值错误! ", e);
+            LoggingUtils.sendErrorLog("业务异常: InputInfoFragment页面获取ChooseCabinetFragment传值错误! ", e);
+        }
+
+        // TODO 离线逻辑, 暂时不做
+
+        Pattern phonePattern = Pattern.compile("^((13[0-9])|(14[0,1,4-9])|(15[0-3,5-9])|(16[2,5,6,7])|(17[0-8])|(18[0-9])|(19[0-3,5-9]))\\d{8}$");
+        // 下单逻辑
+        String finalSectionType = sectionType;
+        if (submitLock.get() == 1) {
+            submitLock.incrementAndGet();
+            binding.keyBoard.inputButtonConfirm.setOnClickListener(view1 -> {
+                Bundle bundle = new Bundle();
+                String mailNo = binding.mailNo.getText().toString();
+//            String phone = binding.delivererPhone.getText().toString();
+                String phoneConfirm = binding.delivererPhoneConfirm.getText().toString();
+                if (!phonePattern.matcher(phoneConfirm).matches()) {
+                    ToastUtils.make(getContext(), "请输入正确的手机号!");
+                } else if (StringUtils.isNullOrEmpty(mailNo)) {
+                    ToastUtils.make(getContext(), "运单号不能为空!请扫描运单号!");
+                } else {
+                    // 验证完 预下单
+                    PreparedOrderVo preparedOrderVo = new PreparedOrderVo();
+                    preparedOrderVo.setClientId(BaseUtils.getClientId());
+                    preparedOrderVo.setMailNo(mailNo);
+                    preparedOrderVo.setCollectorPhone(phoneConfirm);
+                    preparedOrderVo.setLockerType(finalSectionType);
+                    preparedOrderVo.setDelivererPhone(LocalStorage.getInstance().getSession().getPhone());
+
+                    // 预下单
+                    ICSPClient.preparedOrder(LocalStorage.getInstance().getSession().getToken(), preparedOrderVo, new Callback() {
+                        @Override
+                        public void onFailure(@NotNull Call call, @NotNull IOException e) {
+                            // TODO 预下单调用失败
+                            ToastUtils.make(getContext(), "请求服务器失败!网络异常!");
+                            Log.e(TAG, "onFailure: 预下单失败! call: " + call.timeout().toString(), e);
+                            LoggingUtils.sendErrorLog("业务异常: 预下单失败! call: " + call.timeout().toString(), e);
+                        }
+
+                        @Override
+                        public void onResponse(@NotNull Call call, @NotNull Response response) {
+                            ((MainActivity) getActivity()).runOnUiThread(() -> {
+                                try {
+                                    String responseStr = ICSPClient.isSuccessfulAndParseResponse(response);
+                                    if (!StringUtils.isNullOrEmpty(responseStr)) {
+                                        ObjectMapper objectMapper = JacksonUtils.objectmapper;
+                                        ResponseData<PreparedOrderResponseVo> responseData = objectMapper.readValue(responseStr, new TypeReference<ResponseData<PreparedOrderResponseVo>>() {
+                                        });
+                                        data = responseData.getData();
+                                        // 响应信息
+                                        if (responseData.getCode().equals(ICSPConstant.OK)) {
+                                            bundle.putString("preparedOrderResponse", objectMapper.writeValueAsString(data));
+                                            bundle.putString("takeNo", mailNo);
+                                            bundle.putString("sectionType", finalSectionType);
+
+                                            // 跳转到确认投递
+                                            try {
+                                                MainActivity activity = (MainActivity) getActivity();
+                                                activity.getBundleMap().put(InputInfoKeyBoardFragment.class.getName(), bundle);
+                                            } catch (RuntimeException e) {
+                                                Log.e(TAG, "onResponse: InputInfoFragment页面获取SendInfoConfirmFragment传值错误! ", e);
+                                                LoggingUtils.sendErrorLog("业务异常: InputInfoFragment页面获取SendInfoConfirmFragment传值错误! ", e);
+                                            }
+                                            if (null != timer) {
+                                                timer.cancel();
+                                            }
+                                            NavUtils.navigate(InputInfoKeyBoardFragment.this, R.id.action_inputInfoFragment_to_sendInfoConfirmFragment);
+                                        }
+                                        Log.i(TAG, "onResponse: ICSP返回码: " + responseData.getCode() + ", 返回信息: " + responseData.getMsg());
+                                        ToastUtils.make(getContext(), responseData.getMsg());
+                                    } else {
+                                        ToastUtils.make(getContext(), "服务器异常!请稍后重试!");
+                                    }
+                                } catch (JsonProcessingException e) {
+                                    Log.e(TAG, "onResponse: 预下单转换成JSON出错! ", e);
+                                    LoggingUtils.sendErrorLog("业务异常: 预下单转换成JSON出错! ", e);
+                                } catch (RuntimeException e) {
+                                    Log.e(TAG, "onResponse: 预下单失败! ", e);
+                                    LoggingUtils.sendErrorLog("业务异常: 预下单失败! ", e);
+                                }
+                            });
+                        }
+                    });
+                }
+            });
+
+        }
+
+        // 数字输入 5 手机号   4 面单号
+
+        binding.delivererPhoneConfirm.setOnFocusChangeListener((view1, hasFocus) -> {
+            if (hasFocus) {
+                binding.keyBoard.inputButton0.setOnClickListener(v -> {
+                    int length = binding.delivererPhoneConfirm.getText().length();
+                    if (length >= 11) {
+                        ToastUtils.make(getContext(), "手机号不能超过11位! ");
+                        return;
+                    }
+                    int start = binding.delivererPhoneConfirm.getSelectionStart();
+                    binding.delivererPhoneConfirm.getText().insert(start, "0");
+                });
+                binding.keyBoard.inputButton1.setOnClickListener(v -> {
+                    int length = binding.delivererPhoneConfirm.getText().length();
+                    if (length >= 11) {
+                        ToastUtils.make(getContext(), "手机号不能超过11位! ");
+                        return;
+                    }
+                    int start = binding.delivererPhoneConfirm.getSelectionStart();
+                    binding.delivererPhoneConfirm.getText().insert(start, "1");
+                });
+                binding.keyBoard.inputButton2.setOnClickListener(v -> {
+                    int length = binding.delivererPhoneConfirm.getText().length();
+                    if (length >= 11) {
+                        ToastUtils.make(getContext(), "手机号不能超过11位! ");
+                        return;
+                    }
+                    int start = binding.delivererPhoneConfirm.getSelectionStart();
+                    binding.delivererPhoneConfirm.getText().insert(start, "2");
+                });
+                binding.keyBoard.inputButton3.setOnClickListener(v -> {
+                    int length = binding.delivererPhoneConfirm.getText().length();
+                    if (length >= 11) {
+                        ToastUtils.make(getContext(), "手机号不能超过11位! ");
+                        return;
+                    }
+                    int start = binding.delivererPhoneConfirm.getSelectionStart();
+                    binding.delivererPhoneConfirm.getText().insert(start, "3");
+                });
+                binding.keyBoard.inputButton4.setOnClickListener(v -> {
+                    int length = binding.delivererPhoneConfirm.getText().length();
+                    if (length >= 11) {
+                        ToastUtils.make(getContext(), "手机号不能超过11位! ");
+                        return;
+                    }
+                    int start = binding.delivererPhoneConfirm.getSelectionStart();
+                    binding.delivererPhoneConfirm.getText().insert(start, "4");
+                });
+                binding.keyBoard.inputButton5.setOnClickListener(v -> {
+                    int length = binding.delivererPhoneConfirm.getText().length();
+                    if (length >= 11) {
+                        ToastUtils.make(getContext(), "手机号不能超过11位! ");
+                        return;
+                    }
+                    int start = binding.delivererPhoneConfirm.getSelectionStart();
+                    binding.delivererPhoneConfirm.getText().insert(start, "5");
+                });
+                binding.keyBoard.inputButton6.setOnClickListener(v -> {
+                    int length = binding.delivererPhoneConfirm.getText().length();
+                    if (length >= 11) {
+                        ToastUtils.make(getContext(), "手机号不能超过11位! ");
+                        return;
+                    }
+                    int start = binding.delivererPhoneConfirm.getSelectionStart();
+                    binding.delivererPhoneConfirm.getText().insert(start, "6");
+                });
+                binding.keyBoard.inputButton7.setOnClickListener(v -> {
+                    int length = binding.delivererPhoneConfirm.getText().length();
+                    if (length >= 11) {
+                        ToastUtils.make(getContext(), "手机号不能超过11位! ");
+                        return;
+                    }
+                    int start = binding.delivererPhoneConfirm.getSelectionStart();
+                    binding.delivererPhoneConfirm.getText().insert(start, "7");
+                });
+                binding.keyBoard.inputButton8.setOnClickListener(v -> {
+                    int length = binding.delivererPhoneConfirm.getText().length();
+                    if (length >= 11) {
+                        ToastUtils.make(getContext(), "手机号不能超过11位! ");
+                        return;
+                    }
+                    int start = binding.delivererPhoneConfirm.getSelectionStart();
+                    binding.delivererPhoneConfirm.getText().insert(start, "8");
+                });
+                binding.keyBoard.inputButton9.setOnClickListener(v -> {
+                    int length = binding.delivererPhoneConfirm.getText().length();
+                    if (length >= 11) {
+                        ToastUtils.make(getContext(), "手机号不能超过11位");
+                        return;
+                    }
+                    int start = binding.delivererPhoneConfirm.getSelectionStart();
+                    binding.delivererPhoneConfirm.getText().insert(start, "9");
+                });
+                binding.keyBoard.inputButtonCancel.setOnClickListener(v -> {
+                    Editable text = binding.delivererPhoneConfirm.getText();
+                    int start = binding.delivererPhoneConfirm.getSelectionStart();
+                    if (text.length() > 0) {
+                        if (start > 0) {
+                            text.delete(start - 1, start);
+                        }
+                        binding.delivererPhoneConfirm.setText(text, TextView.BufferType.EDITABLE);
+                        binding.delivererPhoneConfirm.setSelection(start - 1 < 0 ? text.length() : start - 1);
+                    }
+                });
+                // 长按删除
+                binding.keyBoard.inputButtonCancel.setOnLongClickListener(v -> {
+                    binding.delivererPhoneConfirm.getText().clear();
+                    return false;
+                });
+            }
+        });
+
+        binding.mailNo.setOnFocusChangeListener((view1, hasFocus) -> {
+            AtomicBoolean caseSmallFlag = new AtomicBoolean(true);
+            
+            binding.keyBoard.inputButton0.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, "0");
+            });
+            binding.keyBoard.inputButton1.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, "1");
+            });
+            binding.keyBoard.inputButton2.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, "2");
+            });
+            binding.keyBoard.inputButton3.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, "3");
+            });
+            binding.keyBoard.inputButton4.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, "4");
+            });
+            binding.keyBoard.inputButton5.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, "5");
+            });
+            binding.keyBoard.inputButton6.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, "6");
+            });
+            binding.keyBoard.inputButton7.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, "7");
+            });
+            binding.keyBoard.inputButton8.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, "8");
+            });
+            binding.keyBoard.inputButton9.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, "9");
+            });
+
+            // todo:绑定字母按键
+            binding.keyBoard.inputButtonQ.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "Q" : "q");
+            });
+            binding.keyBoard.inputButtonW.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "W" : "w");
+            });
+            binding.keyBoard.inputButtonE.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "E" : "e");
+            });
+            binding.keyBoard.inputButtonR.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "R" : "r");
+            });
+            binding.keyBoard.inputButtonT.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "T" : "t");
+            });
+            binding.keyBoard.inputButtonY.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "Y" : "y");
+            });
+            binding.keyBoard.inputButtonU.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "U" : "u");
+            });
+            binding.keyBoard.inputButtonI.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "I" : "i");
+            });
+            binding.keyBoard.inputButtonO.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "O" : "o");
+            });
+            binding.keyBoard.inputButtonP.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "P" : "p");
+            });
+            binding.keyBoard.inputButtonA.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "A" : "a");
+            });
+            binding.keyBoard.inputButtonS.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "S" : "s");
+            });
+            binding.keyBoard.inputButtonD.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "D" : "d");
+            });
+            binding.keyBoard.inputButtonF.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "F" : "f");
+            });
+            binding.keyBoard.inputButtonG.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "G" : "g");
+            });
+            binding.keyBoard.inputButtonH.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "H" : "h");
+            });
+            binding.keyBoard.inputButtonJ.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "J" : "j");
+            });
+            binding.keyBoard.inputButtonK.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "K" : "k");
+            });
+            binding.keyBoard.inputButtonL.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "L" : "l");
+            });
+            binding.keyBoard.inputButtonZ.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "Z" : "z");
+            });
+            binding.keyBoard.inputButtonX.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位!");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "X" : "x");
+            });
+            binding.keyBoard.inputButtonC.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "C" : "c");
+            });
+            binding.keyBoard.inputButtonV.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "V" : "v");
+            });
+            binding.keyBoard.inputButtonB.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "B" : "b");
+            });
+            binding.keyBoard.inputButtonN.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "N" : "n");
+            });
+            binding.keyBoard.inputButtonM.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, caseSmallFlag.get() ? "M" : "m");
+            });
+            //  符号
+            binding.keyBoard.symbolButton1.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, "-");
+            });
+            binding.keyBoard.symbolButton2.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, "/");
+            });
+            binding.keyBoard.symbolButton3.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, ":");
+            });
+            binding.keyBoard.symbolButton4.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, "+");
+            });
+            binding.keyBoard.symbolButton5.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, "(");
+            });
+            binding.keyBoard.symbolButton6.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, ")");
+            });
+            binding.keyBoard.symbolButton7.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, "#");
+            });
+            binding.keyBoard.symbolButton8.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, "@");
+            });
+            binding.keyBoard.symbolButton9.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "面单号最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, ".");
+            });
+            binding.keyBoard.symbolButton10.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.mailNo.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "?");
+                    return;
+                }
+                int start = binding.mailNo.getSelectionStart();
+                binding.mailNo.getText().insert(start, "!");
+            });
+
+
+            // 大小写按键绑定  默认大写
+            binding.keyBoard.inputButtonCaseSmall.setOnClickListener(v -> {
+                if (caseSmallFlag.get()) {
+                    caseSmallFlag.set(false);
+                } else {
+                    caseSmallFlag.set(true);
+                }
+                binding.keyBoard.inputButtonCaseSmall.setText(caseSmallFlag.get() ? "大写" : "小写");
+                // 设置键盘字母大小写
+                binding.keyBoard.inputButtonQ.setText(caseSmallFlag.get() ? "Q" : "q");
+                binding.keyBoard.inputButtonW.setText(caseSmallFlag.get() ? "W" : "w");
+                binding.keyBoard.inputButtonE.setText(caseSmallFlag.get() ? "E" : "e");
+                binding.keyBoard.inputButtonR.setText(caseSmallFlag.get() ? "R" : "r");
+                binding.keyBoard.inputButtonT.setText(caseSmallFlag.get() ? "T" : "t");
+                binding.keyBoard.inputButtonY.setText(caseSmallFlag.get() ? "Y" : "y");
+                binding.keyBoard.inputButtonU.setText(caseSmallFlag.get() ? "U" : "u");
+                binding.keyBoard.inputButtonI.setText(caseSmallFlag.get() ? "I" : "i");
+                binding.keyBoard.inputButtonO.setText(caseSmallFlag.get() ? "O" : "o");
+                binding.keyBoard.inputButtonP.setText(caseSmallFlag.get() ? "P" : "p");
+                binding.keyBoard.inputButtonA.setText(caseSmallFlag.get() ? "A" : "a");
+                binding.keyBoard.inputButtonS.setText(caseSmallFlag.get() ? "S" : "s");
+                binding.keyBoard.inputButtonD.setText(caseSmallFlag.get() ? "D" : "d");
+                binding.keyBoard.inputButtonF.setText(caseSmallFlag.get() ? "F" : "f");
+                binding.keyBoard.inputButtonG.setText(caseSmallFlag.get() ? "G" : "g");
+                binding.keyBoard.inputButtonH.setText(caseSmallFlag.get() ? "H" : "h");
+                binding.keyBoard.inputButtonJ.setText(caseSmallFlag.get() ? "J" : "j");
+                binding.keyBoard.inputButtonK.setText(caseSmallFlag.get() ? "K" : "k");
+                binding.keyBoard.inputButtonL.setText(caseSmallFlag.get() ? "L" : "l");
+                binding.keyBoard.inputButtonZ.setText(caseSmallFlag.get() ? "Z" : "z");
+                binding.keyBoard.inputButtonX.setText(caseSmallFlag.get() ? "X" : "x");
+                binding.keyBoard.inputButtonC.setText(caseSmallFlag.get() ? "C" : "c");
+                binding.keyBoard.inputButtonV.setText(caseSmallFlag.get() ? "V" : "v");
+                binding.keyBoard.inputButtonB.setText(caseSmallFlag.get() ? "B" : "b");
+                binding.keyBoard.inputButtonN.setText(caseSmallFlag.get() ? "N" : "n");
+                binding.keyBoard.inputButtonM.setText(caseSmallFlag.get() ? "M" : "m");
+            });
+
+            binding.keyBoard.inputButtonCancel.setOnClickListener(v -> {
+                Editable text = binding.mailNo.getText();
+                int start = binding.mailNo.getSelectionStart();
+                if (text.length() > 0) {
+                    if (start > 0) {
+                        text.delete(start - 1, start);
+                    }
+                    binding.mailNo.setText(text, TextView.BufferType.EDITABLE);
+                    binding.mailNo.setSelection(start - 1 < 0 ? text.length() : start - 1);
+                }
+            });
+            // 长按删除
+            binding.keyBoard.inputButtonCancel.setOnLongClickListener(v -> {
+                binding.mailNo.getText().clear();
+                return false;
+            });
+
+        });
+
+        binding.returnBtn.setOnClickListener(view1 -> {
+            if (null != timer) {
+                timer.cancel();
+            }
+            NavUtils.navigate(this, R.id.action_inputInfoFragment_to_chooseCabinetFragment);
+        });
+
+        // 默认选中运单号输入框
+        if (!StringUtils.isNullOrEmpty(binding.mailNo.getText().toString())) {
+            binding.delivererPhoneConfirm.requestFocus();
+        } else {
+            binding.mailNo.requestFocus();
+        }
+    }
+
+    private void extracted(AtomicBoolean caseSmallFlag) {
+
+    }
+
+
+    public PreparedOrderResponseVo getData() {
+        return data;
+    }
+
+    @Override
+    public void onDestroy() {
+        if (timer != null) {
+            timer.cancel();
+            timer = null;
+        }
+        super.onDestroy();
+        binding = null;
+        Log.i(TAG, TAG + "被销毁。。。");
+    }
+}

+ 3 - 3
app/src/main/java/com/emato/ich/fragment/SendInfoConfirmFragment.java

@@ -79,10 +79,10 @@ public class SendInfoConfirmFragment extends Fragment {
         MainActivity activity = null;
         try {
             activity = (MainActivity) getActivity();
-            arguments = activity.getBundleMap().get(InputInfoFragment.class.getName());
+            arguments = activity.getBundleMap().get(InputInfoKeyBoardFragment.class.getName());
         } catch (RuntimeException e) {
-            Log.e(TAG, "onResponse: SendInfoConfirmFragment页面获取InputInfoFragment传值错误! ", e);
-            LoggingUtils.sendErrorLog("业务异常: SendInfoConfirmFragment页面获取InputInfoFragment传值错误! ", e);
+            Log.e(TAG, "onResponse: SendInfoConfirmFragment页面获取InputInfoKeyBoardFragment传值错误! ", e);
+            LoggingUtils.sendErrorLog("业务异常: SendInfoConfirmFragment页面获取InputInfoKeyBoardFragment传值错误! ", e);
         }
 
         String orderSn = null;

+ 954 - 0
app/src/main/java/com/emato/ich/fragment/SendKeyBoardFragment.java

@@ -0,0 +1,954 @@
+package com.emato.ich.fragment;
+
+import android.os.Bundle;
+import android.os.CountDownTimer;
+import android.text.Editable;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+import com.emato.ich.MainActivity;
+import com.emato.ich.R;
+import com.emato.ich.api.ICSPClient;
+import com.emato.ich.contant.ICSPConstant;
+import com.emato.ich.contant.SystemConfigConstant;
+import com.emato.ich.databinding.FragmentMyKeyBoardBinding;
+import com.emato.ich.databinding.FragmentSendKeyBoardBinding;
+import com.emato.ich.entity.vo.ResponseData;
+import com.emato.ich.entity.vo.ResponseTokenVo;
+import com.emato.ich.local.LocalStorage;
+import com.emato.ich.utils.BaseUtils;
+import com.emato.ich.utils.ButtonUtils;
+import com.emato.ich.utils.JacksonUtils;
+import com.emato.ich.utils.Log;
+import com.emato.ich.utils.LoggingUtils;
+import com.emato.ich.utils.NavUtils;
+import com.emato.ich.utils.StringUtils;
+import com.emato.ich.utils.TimeOutUtils;
+import com.emato.ich.utils.ToastUtils;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+
+import org.jetbrains.annotations.NotNull;
+
+import java.io.IOException;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.regex.Pattern;
+
+import okhttp3.Call;
+import okhttp3.Callback;
+import okhttp3.Response;
+
+/**
+ * 投递员登录页面
+ */
+public class SendKeyBoardFragment extends Fragment {
+
+    private static final String TAG = SendKeyBoardFragment.class.getName();
+    private FragmentSendKeyBoardBinding binding;
+    private CountDownTimer timer;
+    private long start;
+
+    @Nullable
+    @org.jetbrains.annotations.Nullable
+    @Override
+    public View onCreateView(@NonNull @NotNull LayoutInflater inflater, @Nullable @org.jetbrains.annotations.Nullable ViewGroup container, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) {
+        start = System.currentTimeMillis();
+        binding = FragmentSendKeyBoardBinding.inflate(inflater, container, false);
+        return binding.getRoot();
+    }
+
+    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
+        long end = System.currentTimeMillis();
+        Log.i(TAG, TAG + "页面渲染速度为" + (end - start) + "ms。");
+        super.onViewCreated(view, savedInstanceState);
+
+
+        BaseUtils.disableEditText(binding.editTextTextPersonName4);
+        BaseUtils.disableEditText(binding.editTextTextPersonName5);
+
+        try {
+            MainActivity activity = (MainActivity) getActivity();
+            timer = TimeOutUtils.timeout(activity, SendKeyBoardFragment.this, binding.timeout, 60);
+            timer.start();
+        } catch (Exception e) {
+            Log.e(TAG, "onViewCreated: 倒计时异常! ", e);
+            LoggingUtils.sendErrorLog("业务异常: 投递员登录页面倒计时异常! ", e);
+        }
+
+        // 如果有配置账号密码, 账号定死
+        String loginPhone = null;
+        try {
+            MainActivity activity = (MainActivity) getActivity();
+            loginPhone = activity.getConfigMap().get(SystemConfigConstant.cabinet_login_phone);
+        } catch (Exception e) {
+            Log.e(TAG, "onViewCreated: 配置登录手机号出错! ", e);
+            LoggingUtils.sendErrorLog("业务异常: 配置登录手机号出错! ", e);
+        }
+        if (!StringUtils.isNullOrEmpty(loginPhone)) {
+            String loginPhoneShow = toHidePhone(loginPhone);
+            binding.editTextTextPersonName4.setText(loginPhoneShow);
+            binding.editTextTextPersonName4.setEnabled(false);
+        } else {
+            // 4 手机
+            binding.editTextTextPersonName4.setOnFocusChangeListener((view1, hasFocus) -> {
+                if (hasFocus) {
+                    binding.keyBoard.inputButton0.setOnClickListener(v -> {
+                        int length = binding.editTextTextPersonName4.getText().length();
+                        if (length >= 11) {
+                            ToastUtils.make(getContext(), "手机号不能超过11位! ");
+                            return;
+                        }
+                        int start = binding.editTextTextPersonName4.getSelectionStart();
+                        binding.editTextTextPersonName4.getText().insert(start, "0");
+                    });
+                    binding.keyBoard.inputButton1.setOnClickListener(v -> {
+                        int length = binding.editTextTextPersonName4.getText().length();
+                        if (length >= 11) {
+                            ToastUtils.make(getContext(), "手机号不能超过11位! ");
+                            return;
+                        }
+                        int start = binding.editTextTextPersonName4.getSelectionStart();
+                        binding.editTextTextPersonName4.getText().insert(start, "1");
+                    });
+                    binding.keyBoard.inputButton2.setOnClickListener(v -> {
+                        int length = binding.editTextTextPersonName4.getText().length();
+                        if (length >= 11) {
+                            ToastUtils.make(getContext(), "手机号不能超过11位! ");
+                            return;
+                        }
+                        int start = binding.editTextTextPersonName4.getSelectionStart();
+                        binding.editTextTextPersonName4.getText().insert(start, "2");
+                    });
+                    binding.keyBoard.inputButton3.setOnClickListener(v -> {
+                        int length = binding.editTextTextPersonName4.getText().length();
+                        if (length >= 11) {
+                            ToastUtils.make(getContext(), "手机号不能超过11位! ");
+                            return;
+                        }
+                        int start = binding.editTextTextPersonName4.getSelectionStart();
+                        binding.editTextTextPersonName4.getText().insert(start, "3");
+                    });
+                    binding.keyBoard.inputButton4.setOnClickListener(v -> {
+                        int length = binding.editTextTextPersonName4.getText().length();
+                        if (length >= 11) {
+                            ToastUtils.make(getContext(), "手机号不能超过11位! ");
+                            return;
+                        }
+                        int start = binding.editTextTextPersonName4.getSelectionStart();
+                        binding.editTextTextPersonName4.getText().insert(start, "4");
+                    });
+                    binding.keyBoard.inputButton5.setOnClickListener(v -> {
+                        int length = binding.editTextTextPersonName4.getText().length();
+                        if (length >= 11) {
+                            ToastUtils.make(getContext(), "手机号不能超过11位! ");
+                            return;
+                        }
+                        int start = binding.editTextTextPersonName4.getSelectionStart();
+                        binding.editTextTextPersonName4.getText().insert(start, "5");
+                    });
+                    binding.keyBoard.inputButton6.setOnClickListener(v -> {
+                        int length = binding.editTextTextPersonName4.getText().length();
+                        if (length >= 11) {
+                            ToastUtils.make(getContext(), "手机号不能超过11位! ");
+                            return;
+                        }
+                        int start = binding.editTextTextPersonName4.getSelectionStart();
+                        binding.editTextTextPersonName4.getText().insert(start, "6");
+                    });
+                    binding.keyBoard.inputButton7.setOnClickListener(v -> {
+                        int length = binding.editTextTextPersonName4.getText().length();
+                        if (length >= 11) {
+                            ToastUtils.make(getContext(), "手机号不能超过11位! ");
+                            return;
+                        }
+                        int start = binding.editTextTextPersonName4.getSelectionStart();
+                        binding.editTextTextPersonName4.getText().insert(start, "7");
+                    });
+                    binding.keyBoard.inputButton8.setOnClickListener(v -> {
+                        int length = binding.editTextTextPersonName4.getText().length();
+                        if (length >= 11) {
+                            ToastUtils.make(getContext(), "手机号不能超过11位! ");
+                            return;
+                        }
+                        int start = binding.editTextTextPersonName4.getSelectionStart();
+                        binding.editTextTextPersonName4.getText().insert(start, "8");
+                    });
+                    binding.keyBoard.inputButton9.setOnClickListener(v -> {
+                        int length = binding.editTextTextPersonName4.getText().length();
+                        if (length >= 11) {
+                            ToastUtils.make(getContext(), "手机号不能超过11位! ");
+                            return;
+                        }
+                        int start = binding.editTextTextPersonName4.getSelectionStart();
+                        binding.editTextTextPersonName4.getText().insert(start, "9");
+                    });
+                    binding.keyBoard.inputButtonCancel.setOnClickListener(v -> {
+                        Editable text = binding.editTextTextPersonName4.getText();
+                        int start = binding.editTextTextPersonName4.getSelectionStart();
+                        if (text.length() > 0) {
+                            if (start > 0) {
+                                text.delete(start - 1, start);
+                            }
+                            binding.editTextTextPersonName4.setText(text, TextView.BufferType.EDITABLE);
+                            binding.editTextTextPersonName4.setSelection(start - 1 < 0 ? text.length() : start - 1);
+                        }
+                    });
+                    // 长按删除
+                    binding.keyBoard.inputButtonCancel.setOnLongClickListener(v -> {
+                        binding.editTextTextPersonName4.getText().clear();
+                        return false;
+                    });
+                }
+            });
+        }
+
+        String finalLoginPhone = loginPhone;
+        binding.keyBoard.inputButtonConfirm.setOnClickListener(view1 -> {
+            if (ButtonUtils.isFastClick()) {
+                return;
+            }
+            // 登录逻辑  editTextTextPersonName4 手机 editTextTextPersonName5 密码
+            String sendPhone = !StringUtils.isNullOrEmpty(finalLoginPhone) ? finalLoginPhone : binding.editTextTextPersonName4.getText().toString();
+            String password = binding.editTextTextPersonName5.getText().toString();
+
+            Pattern phonePattern = Pattern.compile("^((13[0-9])|(14[0,1,4-9])|(15[0-3,5-9])|(16[2,5,6,7])|(17[0-8])|(18[0-9])|(19[0-3,5-9]))\\d{8}$");
+            Pattern pwdPattern = Pattern.compile("^[0-9]{8,16}$");
+
+            if (phonePattern.matcher(sendPhone).matches() && pwdPattern.matcher(password).matches()) {
+                ICSPClient.login(sendPhone, password, new Callback() {
+                    @Override
+                    public void onFailure(@NotNull Call call, @NotNull IOException e) {
+                        // TODO 登录失败处理
+                        ToastUtils.make(getContext(), "登录失败!网络异常!");
+                        Log.e(TAG, "onFailure: 登录失败! call: " + call.timeout().toString(), e);
+                        LoggingUtils.sendErrorLog("业务异常: 登录失败!网络异常! ", e);
+                    }
+
+                    @Override
+                    public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
+                        ((MainActivity) getActivity()).runOnUiThread(() -> {
+                            String responseStr = ICSPClient.isSuccessfulAndParseResponse(response);
+                            if (!StringUtils.isNullOrEmpty(responseStr)) {
+                                try {
+                                    ResponseData<ResponseTokenVo> responseData = JacksonUtils.objectmapper.readValue(responseStr, new TypeReference<ResponseData<ResponseTokenVo>>() {
+                                    });
+                                    ResponseTokenVo data = responseData.getData();
+
+                                    if (responseData.getCode().equals(ICSPConstant.OK)) {
+                                        LocalStorage.Session session = new LocalStorage.Session();
+                                        session.setPhone(sendPhone);
+                                        session.setTime(System.currentTimeMillis());
+                                        session.setToken(data.getToken());
+                                        LocalStorage.getInstance().setSession(session);
+                                        // 登录成功
+                                        ToastUtils.make(getContext(), "登录成功!");
+                                        if (null != timer) {
+                                            timer.cancel();
+                                        }
+                                        NavUtils.navigate(SendKeyBoardFragment.this, R.id.action_sendFragment_to_sendMainFragment);
+                                    } else {
+                                        ToastUtils.make(getContext(), responseData.getMsg());
+                                        Log.w(TAG, "onResponse: " + responseData.getMsg());
+                                    }
+
+                                } catch (JsonProcessingException e) {
+                                    Log.e(TAG, "onViewCreated: 解析登录响应信息错误! response body: " + responseStr, e);
+                                    ToastUtils.make(getContext(), "登录失败!");
+                                    LoggingUtils.sendErrorLog("业务异常: 登录失败!", e);
+                                } catch (ClassCastException e) {
+                                    Log.e(TAG, "onResponse: 解析登录响应信息类型转换错误! response body: " + responseStr, e);
+                                    ToastUtils.make(getContext(), "登录失败!");
+                                    LoggingUtils.sendErrorLog("业务异常: 登录失败!", e);
+                                } catch (RuntimeException e) {
+                                    Log.e(TAG, "onResponse: 登录失败! ", e);
+                                    ToastUtils.make(getContext(), "登录失败!");
+                                    LoggingUtils.sendErrorLog("业务异常: 登录失败!未知错误! ", e);
+                                }
+                            } else {
+                                // 登录失败
+                                ToastUtils.make(getContext(), "服务异常!请稍后重试!");
+                            }
+                        });
+                    }
+                });
+            } else if (!phonePattern.matcher(sendPhone).matches()) {
+                ToastUtils.make(getContext(), "输入正确的手机号!");
+            } else if (!pwdPattern.matcher(password).matches()) {
+                ToastUtils.make(getContext(), "密码格式错误!请输入8-16位的数字!");
+            }
+        });
+
+        // 密码
+        binding.editTextTextPersonName5.setOnFocusChangeListener((view1, hasFocus) -> {
+            AtomicBoolean caseSmallFlag = new AtomicBoolean(true);
+            
+            binding.keyBoard.inputButton0.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, "0");
+            });
+            binding.keyBoard.inputButton1.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, "1");
+            });
+            binding.keyBoard.inputButton2.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, "2");
+            });
+            binding.keyBoard.inputButton3.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, "3");
+            });
+            binding.keyBoard.inputButton4.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, "4");
+            });
+            binding.keyBoard.inputButton5.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, "5");
+            });
+            binding.keyBoard.inputButton6.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, "6");
+            });
+            binding.keyBoard.inputButton7.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, "7");
+            });
+            binding.keyBoard.inputButton8.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, "8");
+            });
+            binding.keyBoard.inputButton9.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, "9");
+            });
+
+            // todo:绑定字母按键
+            binding.keyBoard.inputButtonQ.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, caseSmallFlag.get() ? "Q" : "q");
+            });
+            binding.keyBoard.inputButtonW.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, caseSmallFlag.get() ? "W" : "w");
+            });
+            binding.keyBoard.inputButtonE.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, caseSmallFlag.get() ? "E" : "e");
+            });
+            binding.keyBoard.inputButtonR.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, caseSmallFlag.get() ? "R" : "r");
+            });
+            binding.keyBoard.inputButtonT.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, caseSmallFlag.get() ? "T" : "t");
+            });
+            binding.keyBoard.inputButtonY.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, caseSmallFlag.get() ? "Y" : "y");
+            });
+            binding.keyBoard.inputButtonU.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, caseSmallFlag.get() ? "U" : "u");
+            });
+            binding.keyBoard.inputButtonI.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, caseSmallFlag.get() ? "I" : "i");
+            });
+            binding.keyBoard.inputButtonO.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, caseSmallFlag.get() ? "O" : "o");
+            });
+            binding.keyBoard.inputButtonP.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, caseSmallFlag.get() ? "P" : "p");
+            });
+            binding.keyBoard.inputButtonA.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, caseSmallFlag.get() ? "A" : "a");
+            });
+            binding.keyBoard.inputButtonS.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, caseSmallFlag.get() ? "S" : "s");
+            });
+            binding.keyBoard.inputButtonD.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, caseSmallFlag.get() ? "D" : "d");
+            });
+            binding.keyBoard.inputButtonF.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, caseSmallFlag.get() ? "F" : "f");
+            });
+            binding.keyBoard.inputButtonG.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, caseSmallFlag.get() ? "G" : "g");
+            });
+            binding.keyBoard.inputButtonH.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, caseSmallFlag.get() ? "H" : "h");
+            });
+            binding.keyBoard.inputButtonJ.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, caseSmallFlag.get() ? "J" : "j");
+            });
+            binding.keyBoard.inputButtonK.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, caseSmallFlag.get() ? "K" : "k");
+            });
+            binding.keyBoard.inputButtonL.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, caseSmallFlag.get() ? "L" : "l");
+            });
+            binding.keyBoard.inputButtonZ.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, caseSmallFlag.get() ? "Z" : "z");
+            });
+            binding.keyBoard.inputButtonX.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位!");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, caseSmallFlag.get() ? "X" : "x");
+            });
+            binding.keyBoard.inputButtonC.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, caseSmallFlag.get() ? "C" : "c");
+            });
+            binding.keyBoard.inputButtonV.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, caseSmallFlag.get() ? "V" : "v");
+            });
+            binding.keyBoard.inputButtonB.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, caseSmallFlag.get() ? "B" : "b");
+            });
+            binding.keyBoard.inputButtonN.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, caseSmallFlag.get() ? "N" : "n");
+            });
+            binding.keyBoard.inputButtonM.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, caseSmallFlag.get() ? "M" : "m");
+            });
+            //  符号
+            binding.keyBoard.symbolButton1.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, "-");
+            });
+            binding.keyBoard.symbolButton2.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, "/");
+            });
+            binding.keyBoard.symbolButton3.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, ":");
+            });
+            binding.keyBoard.symbolButton4.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, "+");
+            });
+            binding.keyBoard.symbolButton5.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, "(");
+            });
+            binding.keyBoard.symbolButton6.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, ")");
+            });
+            binding.keyBoard.symbolButton7.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, "#");
+            });
+            binding.keyBoard.symbolButton8.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, "@");
+            });
+            binding.keyBoard.symbolButton9.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "密码最多不能超过16位! ");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, ".");
+            });
+            binding.keyBoard.symbolButton10.setOnClickListener(v -> {
+                if(!hasFocus){
+                    return;
+                }
+                int length = binding.editTextTextPersonName5.getText().length();
+                if (length >= 16) {
+                    ToastUtils.make(getContext(), "?");
+                    return;
+                }
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                binding.editTextTextPersonName5.getText().insert(start, "!");
+            });
+
+
+            // 大小写按键绑定  默认大写
+            binding.keyBoard.inputButtonCaseSmall.setOnClickListener(v -> {
+                if (caseSmallFlag.get()) {
+                    caseSmallFlag.set(false);
+                } else {
+                    caseSmallFlag.set(true);
+                }
+                binding.keyBoard.inputButtonCaseSmall.setText(caseSmallFlag.get() ? "大写" : "小写");
+                // 设置键盘字母大小写
+                binding.keyBoard.inputButtonQ.setText(caseSmallFlag.get() ? "Q" : "q");
+                binding.keyBoard.inputButtonW.setText(caseSmallFlag.get() ? "W" : "w");
+                binding.keyBoard.inputButtonE.setText(caseSmallFlag.get() ? "E" : "e");
+                binding.keyBoard.inputButtonR.setText(caseSmallFlag.get() ? "R" : "r");
+                binding.keyBoard.inputButtonT.setText(caseSmallFlag.get() ? "T" : "t");
+                binding.keyBoard.inputButtonY.setText(caseSmallFlag.get() ? "Y" : "y");
+                binding.keyBoard.inputButtonU.setText(caseSmallFlag.get() ? "U" : "u");
+                binding.keyBoard.inputButtonI.setText(caseSmallFlag.get() ? "I" : "i");
+                binding.keyBoard.inputButtonO.setText(caseSmallFlag.get() ? "O" : "o");
+                binding.keyBoard.inputButtonP.setText(caseSmallFlag.get() ? "P" : "p");
+                binding.keyBoard.inputButtonA.setText(caseSmallFlag.get() ? "A" : "a");
+                binding.keyBoard.inputButtonS.setText(caseSmallFlag.get() ? "S" : "s");
+                binding.keyBoard.inputButtonD.setText(caseSmallFlag.get() ? "D" : "d");
+                binding.keyBoard.inputButtonF.setText(caseSmallFlag.get() ? "F" : "f");
+                binding.keyBoard.inputButtonG.setText(caseSmallFlag.get() ? "G" : "g");
+                binding.keyBoard.inputButtonH.setText(caseSmallFlag.get() ? "H" : "h");
+                binding.keyBoard.inputButtonJ.setText(caseSmallFlag.get() ? "J" : "j");
+                binding.keyBoard.inputButtonK.setText(caseSmallFlag.get() ? "K" : "k");
+                binding.keyBoard.inputButtonL.setText(caseSmallFlag.get() ? "L" : "l");
+                binding.keyBoard.inputButtonZ.setText(caseSmallFlag.get() ? "Z" : "z");
+                binding.keyBoard.inputButtonX.setText(caseSmallFlag.get() ? "X" : "x");
+                binding.keyBoard.inputButtonC.setText(caseSmallFlag.get() ? "C" : "c");
+                binding.keyBoard.inputButtonV.setText(caseSmallFlag.get() ? "V" : "v");
+                binding.keyBoard.inputButtonB.setText(caseSmallFlag.get() ? "B" : "b");
+                binding.keyBoard.inputButtonN.setText(caseSmallFlag.get() ? "N" : "n");
+                binding.keyBoard.inputButtonM.setText(caseSmallFlag.get() ? "M" : "m");
+            });
+
+            binding.keyBoard.inputButtonCancel.setOnClickListener(v -> {
+                Editable text = binding.editTextTextPersonName5.getText();
+                int start = binding.editTextTextPersonName5.getSelectionStart();
+                if (text.length() > 0) {
+                    if (start > 0) {
+                        text.delete(start - 1, start);
+                    }
+                    binding.editTextTextPersonName5.setText(text, TextView.BufferType.EDITABLE);
+                    binding.editTextTextPersonName5.setSelection(start - 1 < 0 ? text.length() : start - 1);
+                }
+            });
+            // 长按删除
+            binding.keyBoard.inputButtonCancel.setOnLongClickListener(v -> {
+                binding.editTextTextPersonName5.getText().clear();
+                return false;
+            });
+
+        });
+
+        binding.returnBtn.setOnClickListener(view1 -> {
+            if (ButtonUtils.isFastClick()) {
+                return;
+            }
+            if (null != timer) {
+                timer.cancel();
+            }
+            NavUtils.navigate(this, R.id.action_sendFragment_to_mainFragment);
+        });
+
+
+        // 默认选中密码输入
+        if (!StringUtils.isNullOrEmpty(binding.editTextTextPersonName4.getText().toString())) {
+            binding.editTextTextPersonName5.requestFocus();
+        } else {
+            binding.editTextTextPersonName4.requestFocus();
+        }
+    }
+
+    /**
+     * 隐藏部分信息
+     *
+     * @param loginPhone 投递员手机号
+     * @return 隐藏后的手机号
+     */
+    private String toHidePhone(String loginPhone) {
+        StringBuilder stringBuilder = new StringBuilder();
+        char[] chars = loginPhone.toCharArray();
+        for (int i = 0; i < chars.length; i++) {
+            if (i > 2 && i < 8) {
+                stringBuilder.append('*');
+            } else {
+                stringBuilder.append(chars[i]);
+            }
+        }
+        return stringBuilder.toString();
+    }
+
+    @Override
+    public void onDestroyView() {
+        if (timer != null) {
+            timer.cancel();
+            timer = null;
+        }
+        super.onDestroyView();
+        binding = null;
+
+        Log.i(TAG, TAG + "被销毁。。。");
+    }
+
+}

+ 8 - 2
app/src/main/java/com/emato/ich/utils/TimeOutUtils.java

@@ -11,8 +11,10 @@ import com.emato.ich.R;
 import com.emato.ich.fragment.ChooseCabinetFragment;
 import com.emato.ich.fragment.ExceptionFragment;
 import com.emato.ich.fragment.InputInfoFragment;
+import com.emato.ich.fragment.InputInfoKeyBoardFragment;
 import com.emato.ich.fragment.SendFragment;
 import com.emato.ich.fragment.SendInfoConfirmFragment;
+import com.emato.ich.fragment.SendKeyBoardFragment;
 import com.emato.ich.fragment.SendMainFragment;
 import com.emato.ich.fragment.SendSuccessFragment;
 import com.emato.ich.fragment.TakeCodeFragment;
@@ -80,9 +82,13 @@ public class TimeOutUtils {
             return R.id.actionExceptionFragment_to_mainFragment;
         } else if (fragment instanceof InputInfoFragment) {
             return R.id.action_inputInfoFragment_to_mainFragment;
-        } else if (fragment instanceof SendFragment) {
+        } else if (fragment instanceof InputInfoKeyBoardFragment) {
+            return R.id.action_inputInfoFragment_to_mainFragment;
+        }else if (fragment instanceof SendFragment) {
+            return R.id.action_sendFragment_to_mainFragment;
+        } else if (fragment instanceof SendKeyBoardFragment) {
             return R.id.action_sendFragment_to_mainFragment;
-        } else if (fragment instanceof SendInfoConfirmFragment) {
+        }else if (fragment instanceof SendInfoConfirmFragment) {
             return R.id.action_sendInfoConfirmFragment_to_mainFragment;
         } else if (fragment instanceof SendMainFragment) {
             return R.id.action_sendMainFragment_to_mainFragment;

+ 2 - 2
app/src/main/res/layout/fragment_choose_cabinet.xml

@@ -9,7 +9,7 @@
         android:layout_width="50dp"
         android:layout_height="50dp"
         android:layout_x="285dp"
-        android:layout_y="550dp"
+        android:layout_y="518dp"
         android:gravity="center"
         android:textSize="22dp"
         android:textStyle="bold"/>
@@ -155,7 +155,7 @@
         android:layout_width="80dp"
         android:layout_height="30dp"
         android:layout_x="30dp"
-        android:layout_y="560dp"
+        android:layout_y="529dp"
         android:background="@drawable/return1" />
 
 </AbsoluteLayout>

+ 2 - 2
app/src/main/res/layout/fragment_exception.xml

@@ -9,7 +9,7 @@
         android:layout_width="50dp"
         android:layout_height="50dp"
         android:layout_x="285dp"
-        android:layout_y="550dp"
+        android:layout_y="518dp"
         android:gravity="center"
         android:textSize="22dp"
         android:textStyle="bold"/>
@@ -27,7 +27,7 @@
         android:layout_width="80dp"
         android:layout_height="30dp"
         android:layout_x="30dp"
-        android:layout_y="560dp"
+        android:layout_y="529dp"
         android:background="@drawable/return1" />
 
     <TextView

+ 2 - 2
app/src/main/res/layout/fragment_input_info.xml

@@ -10,7 +10,7 @@
         android:layout_width="80dp"
         android:layout_height="30dp"
         android:layout_x="30dp"
-        android:layout_y="560dp"
+        android:layout_y="529dp"
         android:background="@drawable/return1" />
 
     <EditText
@@ -187,7 +187,7 @@
         android:layout_width="50dp"
         android:layout_height="50dp"
         android:layout_x="285dp"
-        android:layout_y="550dp"
+        android:layout_y="518dp"
         android:gravity="center"
         android:textSize="22dp"
         android:textStyle="bold"/>

+ 71 - 0
app/src/main/res/layout/fragment_input_key_board.xml

@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8"?>
+<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:focusable="true"
+    android:focusableInTouchMode="true">
+
+    <!-- 引入键盘页面 -->
+    <include
+        android:id="@+id/key_board"
+        layout="@layout/fragment_my_key_board"/>
+
+    <EditText
+        android:id="@+id/mail_no"
+        android:layout_width="145dp"
+        android:layout_height="50dp"
+        android:layout_x="25dp"
+        android:layout_y="290dp"
+        android:ems="10"
+        android:hint="@string/input_express_number"
+        android:inputType="none"
+        android:longClickable="false"
+        android:textSize="10dp" />
+
+    <EditText
+        android:id="@+id/deliverer_phone_confirm"
+        android:layout_width="145dp"
+        android:layout_height="50dp"
+        android:layout_x="181dp"
+        android:layout_y="290dp"
+        android:ems="10"
+        android:hint="@string/input_recipients_phone"
+        android:inputType="phone"
+        android:longClickable="false"
+        android:textSize="10dp" />
+
+
+
+    <!--  返回按钮  -->
+    <TextView
+        android:id="@+id/return_btn"
+        android:layout_width="80dp"
+        android:layout_height="29dp"
+        android:layout_x="29dp"
+        android:layout_y="529dp"
+        android:background="@drawable/return1" />
+
+    <!-- 倒计时 -->
+    <TextView
+        android:id="@+id/timeout"
+        android:layout_width="55dp"
+        android:layout_height="55dp"
+        android:layout_x="276dp"
+        android:layout_y="518dp"
+        android:gravity="center"
+        android:textSize="30dp"
+        android:textStyle="bold" />
+
+    <!--    <EditText-->
+<!--        android:id="@+id/deliverer_phone"-->
+<!--        android:layout_width="150dp"-->
+<!--        android:layout_height="50dp"-->
+<!--        android:layout_x="10dp"-->
+<!--        android:layout_y="405dp"-->
+<!--        android:longClickable="false"-->
+<!--        android:textSize="10dp"-->
+<!--        android:ems="10"-->
+<!--        android:hint="@string/input_recipients_phone_confirm"-->
+<!--        android:inputType="phone" />-->
+
+</AbsoluteLayout>

+ 643 - 0
app/src/main/res/layout/fragment_my_key_board.xml

@@ -0,0 +1,643 @@
+<?xml version="1.0" encoding="utf-8"?>
+<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:focusable="true"
+    android:focusableInTouchMode="true">
+    <!--  数字 start -->
+    <TextView
+        android:id="@+id/input_button1"
+        android:layout_width="29dp"
+        android:layout_height="29dp"
+        android:layout_x="17dp"
+        android:layout_y="380dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/number_1"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+
+    <!--  数字3  -->
+    <TextView
+        android:id="@+id/input_button2"
+        android:layout_width="29dp"
+        android:layout_height="29dp"
+        android:layout_x="49dp"
+        android:layout_y="380dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/number_2"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+
+    <!--  数字4  -->
+    <TextView
+        android:id="@+id/input_button3"
+        android:layout_width="29dp"
+        android:layout_height="29dp"
+        android:layout_x="81dp"
+        android:layout_y="380dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/number_3"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+
+    <TextView
+        android:id="@+id/input_button4"
+        android:layout_width="29dp"
+        android:layout_height="29dp"
+        android:layout_x="113dp"
+        android:layout_y="380dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/number_4"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+
+    <!--  数字5  -->
+    <TextView
+        android:id="@+id/input_button5"
+        android:layout_width="27dp"
+        android:layout_height="29dp"
+        android:layout_x="145dp"
+        android:layout_y="380dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/number_5"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+
+    <!--  数字6  -->
+    <TextView
+        android:id="@+id/input_button6"
+        android:layout_width="29dp"
+        android:layout_height="29dp"
+        android:layout_x="177dp"
+        android:layout_y="380dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/number_6"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+
+    <!--  数字7  -->
+    <TextView
+        android:id="@+id/input_button7"
+        android:layout_width="29dp"
+        android:layout_height="29dp"
+        android:layout_x="209dp"
+        android:layout_y="380dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/number_7"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+
+    <!--  数字8  -->
+    <TextView
+        android:id="@+id/input_button8"
+        android:layout_width="29dp"
+        android:layout_height="29dp"
+        android:layout_x="241dp"
+        android:layout_y="380dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/number_8"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+
+    <!--  数字9  -->
+    <TextView
+        android:id="@+id/input_button9"
+        android:layout_width="29dp"
+        android:layout_height="29dp"
+        android:layout_x="273dp"
+        android:layout_y="380dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/number_9"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+
+    <TextView
+        android:id="@+id/input_button0"
+        android:layout_width="29dp"
+        android:layout_height="29dp"
+        android:layout_x="306dp"
+        android:layout_y="380dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/number_0"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+    <!-- 数字end-->
+
+    <!-- 字母start -->
+    <!--  字母Q  -->
+    <TextView
+        android:id="@+id/input_buttonQ"
+        android:layout_width="26dp"
+        android:layout_height="29dp"
+        android:layout_x="17dp"
+        android:layout_y="415dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/letter_Q"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+
+    <!--  字母W  -->
+    <TextView
+        android:id="@+id/input_buttonW"
+        android:layout_width="29dp"
+        android:layout_height="29dp"
+        android:layout_x="49dp"
+        android:layout_y="415dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/letter_W"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+    <!--  字母E  -->
+    <TextView
+        android:id="@+id/input_buttonE"
+        android:layout_width="29dp"
+        android:layout_height="29dp"
+        android:layout_x="81dp"
+        android:layout_y="415dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/letter_E"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+
+    <!--  字母R  -->
+    <TextView
+        android:id="@+id/input_buttonR"
+        android:layout_width="29dp"
+        android:layout_height="29dp"
+        android:layout_x="113dp"
+        android:layout_y="415dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/letter_R"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+
+    <!--  字母T  -->
+    <TextView
+        android:id="@+id/input_buttonT"
+        android:layout_width="29dp"
+        android:layout_height="29dp"
+        android:layout_x="145dp"
+        android:layout_y="415dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/letter_T"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+
+    <!--  字母Y  -->
+    <TextView
+        android:id="@+id/input_buttonY"
+        android:layout_width="29dp"
+        android:layout_height="29dp"
+        android:layout_x="177dp"
+        android:layout_y="415dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/letter_Y"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+
+    <!--  字母U  -->
+    <TextView
+        android:id="@+id/input_buttonU"
+        android:layout_width="29dp"
+        android:layout_height="29dp"
+        android:layout_x="209dp"
+        android:layout_y="415dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/letter_U"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+
+    <!--  字母I  -->
+    <TextView
+        android:id="@+id/input_buttonI"
+        android:layout_width="29dp"
+        android:layout_height="29dp"
+        android:layout_x="241dp"
+        android:layout_y="415dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/letter_I"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+
+    <!--  字母O  -->
+    <TextView
+        android:id="@+id/input_buttonO"
+        android:layout_width="29dp"
+        android:layout_height="29dp"
+        android:layout_x="273dp"
+        android:layout_y="415dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/letter_O"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+    <!--  字母P  -->
+    <TextView
+        android:id="@+id/input_buttonP"
+        android:layout_width="29dp"
+        android:layout_height="29dp"
+        android:layout_x="306dp"
+        android:layout_y="415dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/letter_P"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+
+    <!--  字母A  -->
+    <TextView
+        android:id="@+id/input_buttonA"
+        android:layout_width="26dp"
+        android:layout_height="29dp"
+        android:layout_x="17dp"
+        android:layout_y="449dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/letter_A"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+
+    <!--  字母S  -->
+    <TextView
+        android:id="@+id/input_buttonS"
+        android:layout_width="29dp"
+        android:layout_height="29dp"
+        android:layout_x="49dp"
+        android:layout_y="449dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/letter_S"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+
+    <!--  字母D  -->
+    <TextView
+        android:id="@+id/input_buttonD"
+        android:layout_width="29dp"
+        android:layout_height="29dp"
+        android:layout_x="81dp"
+        android:layout_y="449dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/letter_D"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+
+    <!--  字母F  -->
+    <TextView
+        android:id="@+id/input_buttonF"
+        android:layout_width="29dp"
+        android:layout_height="29dp"
+        android:layout_x="113dp"
+        android:layout_y="449dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/letter_F"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+
+    <!--  字母G  -->
+    <TextView
+        android:id="@+id/input_buttonG"
+        android:layout_width="29dp"
+        android:layout_height="29dp"
+        android:layout_x="145dp"
+        android:layout_y="449dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/letter_G"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+
+    <!--  字母H  -->
+    <TextView
+        android:id="@+id/input_buttonH"
+        android:layout_width="29dp"
+        android:layout_height="29dp"
+        android:layout_x="177dp"
+        android:layout_y="449dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/letter_H"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+
+    <!--  字母J  -->
+    <TextView
+        android:id="@+id/input_buttonJ"
+        android:layout_width="29dp"
+        android:layout_height="29dp"
+        android:layout_x="209dp"
+        android:layout_y="449dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/letter_J"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+
+    <!--  字母K  -->
+    <TextView
+        android:id="@+id/input_buttonK"
+        android:layout_width="29dp"
+        android:layout_height="29dp"
+        android:layout_x="241dp"
+        android:layout_y="449dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/letter_K"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+
+    <!--  字母L  -->
+    <TextView
+        android:id="@+id/input_buttonL"
+        android:layout_width="29dp"
+        android:layout_height="29dp"
+        android:layout_x="273dp"
+        android:layout_y="449dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/letter_L"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+
+    <!--  字母Z  -->
+    <TextView
+        android:id="@+id/input_buttonZ"
+        android:layout_width="29dp"
+        android:layout_height="29dp"
+        android:layout_x="59dp"
+        android:layout_y="483dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/letter_Z"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+
+    <!--  字母X  -->
+    <TextView
+        android:id="@+id/input_buttonX"
+        android:layout_width="29dp"
+        android:layout_height="29dp"
+        android:layout_x="91dp"
+        android:layout_y="483dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/letter_X"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+
+    <!--  字母C  -->
+    <TextView
+        android:id="@+id/input_buttonC"
+        android:layout_width="29dp"
+        android:layout_height="29dp"
+        android:layout_x="124dp"
+        android:layout_y="483dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/letter_C"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+
+    <!--  字母V  -->
+    <TextView
+        android:id="@+id/input_buttonV"
+        android:layout_width="29dp"
+        android:layout_height="29dp"
+        android:layout_x="158dp"
+        android:layout_y="483dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/letter_V"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+
+    <!--  字母B  -->
+    <TextView
+        android:id="@+id/input_buttonB"
+        android:layout_width="29dp"
+        android:layout_height="29dp"
+        android:layout_x="192dp"
+        android:layout_y="483dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/letter_B"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+
+    <!--  字母N  -->
+    <TextView
+        android:id="@+id/input_buttonN"
+        android:layout_width="29dp"
+        android:layout_height="29dp"
+        android:layout_x="225dp"
+        android:layout_y="483dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/letter_N"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+
+    <!--  字母M  -->
+    <TextView
+        android:id="@+id/input_buttonM"
+        android:layout_width="29dp"
+        android:layout_height="29dp"
+        android:layout_x="261dp"
+        android:layout_y="483dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/letter_M"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+    <!-- 字母end -->
+
+
+
+    <!--  大小写切换  -->
+    <TextView
+        android:id="@+id/input_button_case_small"
+        android:layout_width="37dp"
+        android:layout_height="29dp"
+        android:layout_x="17dp"
+        android:layout_y="483dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/capital"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+
+    <!--  删除按键  -->
+
+    <TextView
+        android:id="@+id/input_button_cancel"
+        android:layout_width="29dp"
+        android:layout_height="29dp"
+        android:layout_x="306dp"
+        android:layout_y="449dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/cancel_btn"
+        android:textColor="@color/black"
+        android:textSize="12sp"
+        android:textStyle="bold" />
+
+
+    <!--  确认  -->
+    <TextView
+        android:id="@+id/input_button_confirm"
+        android:layout_width="42dp"
+        android:layout_height="29dp"
+        android:layout_x="296dp"
+        android:layout_y="483dp"
+        android:background="@drawable/confirm_button"
+        android:gravity="center"
+        android:text="@string/confirm_btn"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+
+    <!-- 符号 -->
+    <TextView
+        android:id="@+id/symbol_button_1"
+        android:layout_width="29dp"
+        android:layout_height="29dp"
+        android:layout_x="17dp"
+        android:layout_y="345dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/symbol_1"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+    <TextView
+        android:id="@+id/symbol_button_2"
+        android:layout_width="29dp"
+        android:layout_height="29dp"
+        android:layout_x="49dp"
+        android:layout_y="345dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/symbol_2"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+    <TextView
+        android:id="@+id/symbol_button_3"
+        android:layout_width="29dp"
+        android:layout_height="29dp"
+        android:layout_x="81dp"
+        android:layout_y="345dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/symbol_3"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+    <TextView
+        android:id="@+id/symbol_button_4"
+        android:layout_width="29dp"
+        android:layout_height="29dp"
+        android:layout_x="113dp"
+        android:layout_y="345dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/symbol_4"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+    <TextView
+        android:id="@+id/symbol_button_5"
+        android:layout_width="29dp"
+        android:layout_height="29dp"
+        android:layout_x="145dp"
+        android:layout_y="345dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/symbol_5"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+    <TextView
+        android:id="@+id/symbol_button_6"
+        android:layout_width="29dp"
+        android:layout_height="29dp"
+        android:layout_x="177dp"
+        android:layout_y="345dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/symbol_6"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+    <TextView
+        android:id="@+id/symbol_button_7"
+        android:layout_width="29dp"
+        android:layout_height="29dp"
+        android:layout_x="209dp"
+        android:layout_y="345dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/symbol_7"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+    <TextView
+        android:id="@+id/symbol_button_8"
+        android:layout_width="29dp"
+        android:layout_height="29dp"
+        android:layout_x="241dp"
+        android:layout_y="345dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/symbol_8"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+    <TextView
+        android:id="@+id/symbol_button_9"
+        android:layout_width="29dp"
+        android:layout_height="29dp"
+        android:layout_x="273dp"
+        android:layout_y="345dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/symbol_9"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+
+    <TextView
+        android:id="@+id/symbol_button_10"
+        android:layout_width="29dp"
+        android:layout_height="29dp"
+        android:layout_x="306dp"
+        android:layout_y="345dp"
+        android:background="@drawable/num_button"
+        android:gravity="center"
+        android:text="@string/symbol_10"
+        android:textColor="@color/black"
+        android:textSize="10dp" />
+
+    <!--    <TextView-->
+    <!--        android:id="@+id/symbol_button_11"-->
+    <!--        android:layout_width="25dp"-->
+    <!--        android:layout_height="29dp"-->
+    <!--        android:layout_x="17dp"-->
+    <!--        android:layout_y="345dp"-->
+    <!--        android:background="@drawable/num_button"-->
+    <!--        android:gravity="center"-->
+    <!--        android:text="@string/symbol_11"-->
+    <!--        android:textColor="@color/black"-->
+    <!--        android:textSize="10dp" />-->
+    <!-- 符号 end-->
+</AbsoluteLayout>

+ 2 - 2
app/src/main/res/layout/fragment_send.xml

@@ -15,7 +15,7 @@
         android:layout_width="80dp"
         android:layout_height="30dp"
         android:layout_x="30dp"
-        android:layout_y="560dp"
+        android:layout_y="529dp"
         android:background="@drawable/return1" />
 
     <EditText
@@ -192,7 +192,7 @@
         android:layout_width="50dp"
         android:layout_height="50dp"
         android:layout_x="285dp"
-        android:layout_y="550dp"
+        android:layout_y="518dp"
         android:gravity="center"
         android:textSize="22dp"
         android:textStyle="bold"/>

+ 2 - 2
app/src/main/res/layout/fragment_send_info_confirm.xml

@@ -8,7 +8,7 @@
         android:layout_width="90dp"
         android:layout_height="35dp"
         android:layout_x="14dp"
-        android:layout_y="562dp"
+        android:layout_y="540dp"
         android:background="@drawable/return_main" />
 
     <TextView
@@ -16,7 +16,7 @@
         android:layout_width="50dp"
         android:layout_height="50dp"
         android:layout_x="285dp"
-        android:layout_y="550dp"
+        android:layout_y="545dp"
         android:gravity="center"
         android:textSize="22dp"
         android:textStyle="bold"/>

+ 61 - 0
app/src/main/res/layout/fragment_send_key_board.xml

@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8"?>
+<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:focusable="true"
+    android:focusableInTouchMode="true">
+
+    <include
+        android:id="@+id/key_board"
+        layout="@layout/fragment_my_key_board"/>
+
+    <!--  返回按钮  -->
+    <TextView
+        android:id="@+id/return_btn"
+        android:layout_width="80dp"
+        android:layout_height="29dp"
+        android:layout_x="29dp"
+        android:layout_y="529dp"
+        android:background="@drawable/return1" />
+
+    <!-- 倒计时 -->
+    <TextView
+        android:id="@+id/timeout"
+        android:layout_width="50dp"
+        android:layout_height="50dp"
+        android:layout_x="286dp"
+        android:layout_y="518dp"
+        android:gravity="center"
+        android:textSize="30dp"
+        android:textStyle="bold" />
+    <!--  投递员手机号  -->
+    <EditText
+        android:id="@+id/editTextTextPersonName4"
+        android:layout_width="145dp"
+        android:layout_height="50dp"
+        android:layout_x="25dp"
+        android:layout_y="290dp"
+        android:ems="15"
+        android:hint="@string/input_send_phone"
+        android:inputType="number"
+        android:longClickable="false"
+        android:textSize="10dp" />
+    <!--  投递员密码  -->
+
+    <EditText
+        android:id="@+id/editTextTextPersonName5"
+        android:layout_width="145dp"
+        android:layout_height="50dp"
+        android:layout_x="181dp"
+        android:layout_y="290dp"
+        android:ems="15"
+        android:hint="@string/input_send_password"
+        android:inputType="textPassword"
+        android:longClickable="false"
+        android:textSize="10dp" />
+
+
+
+
+
+</AbsoluteLayout>

+ 2 - 2
app/src/main/res/layout/fragment_send_main.xml

@@ -8,7 +8,7 @@
         android:layout_width="50dp"
         android:layout_height="50dp"
         android:layout_x="285dp"
-        android:layout_y="550dp"
+        android:layout_y="518dp"
         android:gravity="center"
         android:textSize="22dp"
         android:textStyle="bold"/>
@@ -18,7 +18,7 @@
         android:layout_width="80dp"
         android:layout_height="30dp"
         android:layout_x="30dp"
-        android:layout_y="560dp"
+        android:layout_y="529dp"
         android:background="@drawable/return1" />
 
     <TextView

+ 2 - 2
app/src/main/res/layout/fragment_send_success.xml

@@ -8,7 +8,7 @@
         android:layout_width="50dp"
         android:layout_height="50dp"
         android:layout_x="285dp"
-        android:layout_y="550dp"
+        android:layout_y="518dp"
         android:gravity="center"
         android:textSize="22dp"
         android:textStyle="bold"/>
@@ -18,7 +18,7 @@
         android:layout_width="90dp"
         android:layout_height="35dp"
         android:layout_x="14dp"
-        android:layout_y="562dp"
+        android:layout_y="529dp"
         android:background="@drawable/return_main" />
 
     <TextView

+ 3 - 3
app/src/main/res/layout/fragment_take.xml

@@ -7,7 +7,7 @@
         android:layout_width="50dp"
         android:layout_height="50dp"
         android:layout_x="285dp"
-        android:layout_y="550dp"
+        android:layout_y="545dp"
         android:gravity="center"
         android:textSize="22dp"
         android:textStyle="bold"/>
@@ -17,7 +17,7 @@
         android:layout_width="160dp"
         android:layout_height="250dp"
         android:layout_x="26dp"
-        android:layout_y="305dp"
+        android:layout_y="295dp"
         android:background="@drawable/textview_border"
         android:gravity="center_horizontal"
         android:paddingTop="15dp"
@@ -67,7 +67,7 @@
         android:layout_width="80dp"
         android:layout_height="30dp"
         android:layout_x="30dp"
-        android:layout_y="560dp"
+        android:layout_y="548dp"
         android:background="@drawable/return1" />
 
 </AbsoluteLayout>

+ 4 - 4
app/src/main/res/layout/fragment_take_code.xml

@@ -10,7 +10,7 @@
         android:layout_width="50dp"
         android:layout_height="50dp"
         android:layout_x="285dp"
-        android:layout_y="550dp"
+        android:layout_y="540dp"
         android:gravity="center"
         android:textSize="22dp"
         android:textStyle="bold"/>
@@ -18,9 +18,9 @@
     <TextView
         android:id="@+id/fast_take_send_bg1"
         android:layout_width="160dp"
-        android:layout_height="250dp"
+        android:layout_height="230dp"
         android:layout_x="19dp"
-        android:layout_y="317dp"
+        android:layout_y="315dp"
         android:background="@drawable/textview_border"
         android:gravity="center_horizontal"
         android:paddingTop="15dp"
@@ -161,7 +161,7 @@
         android:layout_width="80dp"
         android:layout_height="30dp"
         android:layout_x="32dp"
-        android:layout_y="574dp"
+        android:layout_y="550dp"
         android:background="@drawable/return1" />
 
     <TextView

+ 2 - 2
app/src/main/res/layout/fragment_take_success.xml

@@ -10,7 +10,7 @@
         android:layout_width="50dp"
         android:layout_height="50dp"
         android:layout_x="285dp"
-        android:layout_y="550dp"
+        android:layout_y="545dp"
         android:gravity="center"
         android:textSize="22dp"
         android:textStyle="bold"/>
@@ -30,7 +30,7 @@
         android:layout_width="90dp"
         android:layout_height="35dp"
         android:layout_x="14dp"
-        android:layout_y="562dp"
+        android:layout_y="540dp"
         android:background="@drawable/return_main" />
 
     <TextView

+ 4 - 4
app/src/main/res/navigation/nav_graph.xml

@@ -23,9 +23,9 @@
     <!--  投递页面:投递员登录页面  -->
     <fragment
         android:id="@+id/SendFragment"
-        android:name="com.emato.ich.fragment.SendFragment"
+        android:name="com.emato.ich.fragment.SendKeyBoardFragment"
         android:label="@string/send_fragment_label"
-        tools:layout="@layout/fragment_send">
+        tools:layout="@layout/fragment_send_key_board">
 
         <action
             android:id="@+id/action_sendFragment_to_sendMainFragment"
@@ -38,9 +38,9 @@
     <!--  输入投递信息  -->
     <fragment
         android:id="@+id/InputInfoFragment"
-        android:name="com.emato.ich.fragment.InputInfoFragment"
+        android:name="com.emato.ich.fragment.InputInfoKeyBoardFragment"
         android:label=""
-        tools:layout="@layout/fragment_input_info">
+        tools:layout="@layout/fragment_input_key_board">
 
         <action
             android:id="@+id/action_inputInfoFragment_to_sendInfoConfirmFragment"

+ 4 - 0
app/src/main/res/values/colors.xml

@@ -31,4 +31,8 @@
     <color name="exception_solid_color">#cccccc</color>
 
     <color name="none_send_btn">#f00</color>
+
+
+    <color name="edt_text_color">#f00</color>
+
 </resources>

+ 40 - 1
app/src/main/res/values/strings.xml

@@ -20,7 +20,46 @@
     <string name="number_8">8</string>
     <string name="number_9">9</string>
     <string name="number_0">0</string>
-    <string name="cancel_btn">← </string>
+    <string name="letter_Q">Q</string>
+    <string name="letter_W">W</string>
+    <string name="letter_E">E</string>
+    <string name="letter_R">R</string>
+    <string name="letter_T">T</string>
+    <string name="letter_Y">Y</string>
+    <string name="letter_U">U</string>
+    <string name="letter_I">I</string>
+    <string name="letter_O">O</string>
+    <string name="letter_P">P</string>
+    <string name="letter_A">A</string>
+    <string name="letter_S">S</string>
+    <string name="letter_D">D</string>
+    <string name="letter_F">F</string>
+    <string name="letter_G">G</string>
+    <string name="letter_H">H</string>
+    <string name="letter_J">J</string>
+    <string name="letter_K">K</string>
+    <string name="letter_L">L</string>
+    <string name="letter_Z">Z</string>
+    <string name="letter_X">X</string>
+    <string name="letter_C">C</string>
+    <string name="letter_V">V</string>
+    <string name="letter_B">B</string>
+    <string name="letter_N">N</string>
+    <string name="letter_M">M</string>
+    <string name="capital">大写</string>
+    <string name="lowercase">小写</string>
+    <string name="symbol_1">-</string>
+    <string name="symbol_2">/</string>
+    <string name="symbol_3">:</string>
+    <string name="symbol_4">;</string>
+    <string name="symbol_5">(</string>
+    <string name="symbol_6">)</string>
+    <string name="symbol_7">#</string>
+    <string name="symbol_8">@</string>
+    <string name="symbol_9">.</string>
+    <string name="symbol_10">!</string>
+    <string name="symbol_11">?</string>
+    <string name="cancel_btn">←</string>
     <string name="confirm_btn">确 认</string>
     <string name="input_recipients_phone_confirm">请再次输入取件人手机号</string>
     <string name="input_send_password">请输入投递人密码</string>