自定义数字键盘组件

自定义数字键盘组件,实现了数字校验,按钮事件等,效果图如下: 输入图片说明 布局代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="60dp">
        <Button
            android:id="@+id/keyboard_1"
            android:layout_weight="1"
            style="@style/keyboardBtn"
            android:background="@drawable/keyboard_btn"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="@string/kb_1" />
        <Button
            android:id="@+id/keyboard_2"
            android:layout_weight="1"
            style="@style/keyboardBtn"
            android:background="@drawable/keyboard_btn"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="@string/kb_2" />
        <Button
            android:id="@+id/keyboard_3"
            android:layout_weight="1"
            style="@style/keyboardBtn"
            android:background="@drawable/keyboard_btn"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="@string/kb_3" />
        <Button
            android:id="@+id/keyboard_clear"
            android:layout_weight="1"
            android:textColor="@color/btn_bg_red_color"
            android:textSize="@dimen/abc_text_size_title_material"
            android:background="@drawable/keyboard_btn"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="@string/kb_clear" />
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="60dp">
        <Button
            android:id="@+id/keyboard_4"
            android:layout_weight="1"
            style="@style/keyboardBtn"
            android:background="@drawable/keyboard_btn"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="@string/kb_4" />
        <Button
            android:id="@+id/keyboard_5"
            android:layout_weight="1"
            style="@style/keyboardBtn"
            android:background="@drawable/keyboard_btn"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="@string/kb_5" />
        <Button
            android:id="@+id/keyboard_6"
            android:layout_weight="1"
            style="@style/keyboardBtn"
            android:background="@drawable/keyboard_btn"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="@string/kb_6" />
        <LinearLayout
            android:id="@+id/keyboard_back"
            android:layout_weight="1"
            android:background="@drawable/keyboard_btn"
            android:gravity="center"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <TextView
                android:background="@drawable/keyboard_clear_bitmap"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
        </LinearLayout>

    </LinearLayout>
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="120dp">
        <LinearLayout
            android:layout_weight="1"
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="60dp">
                <Button
                    android:id="@+id/keyboard_7"
                    android:layout_weight="1"
                    style="@style/keyboardBtn"
                    android:background="@drawable/keyboard_btn"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:text="@string/kb_7" />
                <Button
                    android:id="@+id/keyboard_8"
                    android:layout_weight="1"
                    style="@style/keyboardBtn"
                    android:background="@drawable/keyboard_btn"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:text="@string/kb_8" />
                <Button
                    android:id="@+id/keyboard_9"
                    android:layout_weight="1"
                    style="@style/keyboardBtn"
                    android:background="@drawable/keyboard_btn"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:text="@string/kb_9" />
            </LinearLayout>
            <LinearLayout
                android:orientation="horizontal"
                android:layout_width="match_parent"
                android:layout_height="60dp">
                <Button
                    android:id="@+id/keyboard_0"
                    android:layout_weight="2"
                    style="@style/keyboardBtn"
                    android:background="@drawable/keyboard_btn"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:text="@string/kb_0" />
                <Button
                    android:id="@+id/keyboard_dian"
                    android:layout_weight="1"
                    style="@style/keyboardBtn"
                    android:background="@drawable/keyboard_btn"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:text="@string/kb_dian" />
            </LinearLayout>
        </LinearLayout>
        <Button
            android:id="@+id/keyboard_alipay"
            android:layout_weight="3"
            android:textColor="@color/white"
            android:textSize="@dimen/abc_text_size_title_material"
            android:background="@color/pay_btn_grey"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="收款" />
    </LinearLayout>
</LinearLayout>

对应的封装的Java代码:

package com.zqsy.qrcodebox.component;

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;

import com.zqsy.qrcodebox.R;

/**
 * Created by zhangda on 2017/12/3.
 * 自定义数字键盘组件
 */

public class NumberKeyBoard extends LinearLayout{
    private Context mContext;
    private OnValueChangedListener onValueChangedListener;
    private OnAlipayCheckedListener onAlipayCheckedListener;
    private OnWeixinCheckedListener onWeixinCheckedListener;
    private String resultStr = "";

    private Button btn1;
    private Button btn2;
    private Button btn3;
    private Button btn4;
    private Button btn5;
    private Button btn6;
    private Button btn7;
    private Button btn8;
    private Button btn9;
    private Button btn0;
    private Button btnDian;
    private LinearLayout btnBack;
    private Button btnClear;
    private Button btnAlipay;
//    private Button btnWeixin;

    public NumberKeyBoard(Context context) {
        super(context);
    }

    public NumberKeyBoard(Context context, AttributeSet attrs) {
        super(context, attrs);
        mContext = context;
        LayoutInflater.from(context).inflate(R.layout.component_keyborad, this);

        initBtnsListeners();
    }

    private void initBtnsListeners() {
        btn1 = findViewById(R.id.keyboard_1);
        btn2 = findViewById(R.id.keyboard_2);
        btn3 = findViewById(R.id.keyboard_3);
        btn4 = findViewById(R.id.keyboard_4);
        btn5 = findViewById(R.id.keyboard_5);
        btn6 = findViewById(R.id.keyboard_6);
        btn7 = findViewById(R.id.keyboard_7);
        btn8 = findViewById(R.id.keyboard_8);
        btn9 = findViewById(R.id.keyboard_9);
        btn0 = findViewById(R.id.keyboard_0);
        btnDian = findViewById(R.id.keyboard_dian);
        btnBack = findViewById(R.id.keyboard_back);
        btnClear = findViewById(R.id.keyboard_clear);
        btnAlipay = findViewById(R.id.keyboard_alipay);
//        btnWeixin = findViewById(R.id.keyboard_weixin);
        OnClickListener buttonsOnClickListener = new OnClickListener() {
            @Override
            public void onClick(View view) {
                switch (view.getId()){
                    case R.id.keyboard_1:
                        addNumberToResult("1");
                        break;
                    case R.id.keyboard_2:
                        addNumberToResult("2");
                        break;
                    case R.id.keyboard_3:
                        addNumberToResult("3");
                        break;
                    case R.id.keyboard_4:
                        addNumberToResult("4");
                        break;
                    case R.id.keyboard_5:
                        addNumberToResult("5");
                        break;
                    case R.id.keyboard_6:
                        addNumberToResult("6");
                        break;
                    case R.id.keyboard_7:
                        addNumberToResult("7");
                        break;
                    case R.id.keyboard_8:
                        addNumberToResult("8");
                        break;
                    case R.id.keyboard_9:
                        addNumberToResult("9");
                        break;
                    case R.id.keyboard_0:
                        addNumberToResult("0");
                        break;
                    case R.id.keyboard_dian:
                        addNumberToResult(".");
                        break;
                    case R.id.keyboard_back:
                        reduceNumberToResult();
                        break;
                    case R.id.keyboard_clear:
                        clearNumber();
                        break;
                }

            }
        };

        btn1.setOnClickListener(buttonsOnClickListener);
        btn2.setOnClickListener(buttonsOnClickListener);
        btn3.setOnClickListener(buttonsOnClickListener);
        btn4.setOnClickListener(buttonsOnClickListener);
        btn5.setOnClickListener(buttonsOnClickListener);
        btn6.setOnClickListener(buttonsOnClickListener);
        btn7.setOnClickListener(buttonsOnClickListener);
        btn8.setOnClickListener(buttonsOnClickListener);
        btn9.setOnClickListener(buttonsOnClickListener);
        btn0.setOnClickListener(buttonsOnClickListener);
        btnDian.setOnClickListener(buttonsOnClickListener);
        btnBack.setOnClickListener(buttonsOnClickListener);
        btnClear.setOnClickListener(buttonsOnClickListener);

        btnAlipay.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                //支付按钮可以点击时才触发事件
                if(btnAlipay.getTag() != null && btnAlipay.getTag().equals("canPress")){
                    if(onAlipayCheckedListener != null){
                        onAlipayCheckedListener.onClick(formatResult(resultStr));
                    }
                }
            }
        });

//        btnWeixin.setOnClickListener(new OnClickListener() {
//            @Override
//            public void onClick(View view) {
//                if(onWeixinCheckedListener != null){
//                    onWeixinCheckedListener.onClick(formatResult(resultStr));
//                }
//
//            }
//        });
    }

    //清除数字
    public void clearNumber() {
        resultStr = "";
        if(onValueChangedListener != null){
            onValueChangedListener.onChange(formatResult(resultStr));
        }
    }

    //擦除数字
    private void reduceNumberToResult() {
        if(resultStr.length() > 0){
            resultStr = resultStr.substring(0, resultStr.length()-1);
        }
        if(onValueChangedListener != null){
            onValueChangedListener.onChange(formatResult(resultStr));
        }
    }

    //增加数字
    private void addNumberToResult(String numberStr) {
        if(resultStr.indexOf(".") >= 0){
            if(numberStr.equals(".")){
                return;
            }else{
                //限制小数点后面最多有两位小数
                int xiaoshuLen = resultStr.substring(resultStr.indexOf("."), resultStr.length()).length();
                if(xiaoshuLen == 3){
                    return;
                }
            }
        }

        //第一次输入的是点,显示0.
        if(resultStr.equals("") && numberStr.equals(".")){
            numberStr = "0.";
        }

        //数字前多次输入0,只显示一个0
        if(resultStr != null && !resultStr.equals("")
                && resultStr.equals("0") && numberStr.equals("0")){
            return;
        }

        resultStr += numberStr;
        if(onValueChangedListener != null){
            onValueChangedListener.onChange(formatResult(resultStr));
        }
    }

    private String formatResult(String str){
        if(str == null || str.equals("")){
            //收款按钮设置为灰色
            btnAlipay.setTag("cannotPress");
            btnAlipay.setBackgroundColor(getResources().getColor(R.color.pay_btn_grey));
            return "0";
        }else{
            double resultDou = Double.parseDouble(str);
            if(resultDou > 0){
                btnAlipay.setTag("canPress");
                btnAlipay.setBackgroundColor(getResources().getColor(R.color.btn_bg_red_color));
            }else{
                btnAlipay.setTag("cannotPress");
                btnAlipay.setBackgroundColor(getResources().getColor(R.color.pay_btn_grey));
            }
        }
        return str;
    }


    /***
     * 键盘控件的值改变事件方法
     * @param listener
     */
    public void setOnValueChangedListener(OnValueChangedListener listener){
        onValueChangedListener = listener;
    }

    /***
     * 支付宝结账事件
     * @param listener
     */
    public void setOnAlipayCheckedListener(OnAlipayCheckedListener listener){
        onAlipayCheckedListener = listener;
    }

    /***
     * 微信结账事件
     * @param listener
     */
    public void setOnWeixinCheckedListener(OnWeixinCheckedListener listener){
        onWeixinCheckedListener = listener;
    }

    public interface OnValueChangedListener{
        void onChange(String result);
    }

    public interface OnAlipayCheckedListener{
        void onClick(String result);
    }

    public interface OnWeixinCheckedListener{
        void onClick(String result);
    }


}

在需要使用该组件的布局文件中添加如下:

<yourpakage.component.NumberKeyBoard
        android:id="@+id/cashier_numberKeyBoard"
        android:layout_alignParentBottom="true"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

    </yourpakage.component.NumberKeyBoard>

在需要使用该组件的activity添加:

NumberKeyBoard numberKeyBoard = findViewById(R.id.cashier_numberKeyBoard);
numberKeyBoard.setOnValueChangedListener(new NumberKeyBoard.OnValueChangedListener() {
             @Override
             public void onChange(String result) {
                 cashier_account.setText(result+"");
             }
         });

         numberKeyBoard.setOnAlipayCheckedListener(new NumberKeyBoard.OnAlipayCheckedListener() {
             @Override
             public void onClick(String result) {
                 goToPay(result, "alipay");
             }
         });

ok,大功告成!

转载于:https://my.oschina.net/u/1011854/blog/1594627

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值