Android popwindow 实现自定义数字键盘

**

Android popwindow 实现自定义数字键盘

因项目需要实现了一个自定义的数字输入键盘,特此记录。
只有截图(GIF 不会生成 …….):
这里写图片描述
**
1、键盘源码 KeyBoardView.java

/**
 * Created by zyj on 2017/6/24.
 */
public class KeyBoardView extends PopupWindow implements View.OnClickListener ,View.OnLongClickListener{
    //点击的view
    private View clickView;
    //
    private View conentView;
    //按键 1~9 . 完成 清除
    private TextView one, two, three, four, five, six, seven, eight, nine, zero, point, equals, clear;
    //显示用户当前输入了那些内容
    private TextView input_content;
    private Activity activity;
    //记录键盘的值,默认值是“0”
    private String keyValues;
    //这个就是默认值...
    private static final String DEFAULT = "0";
    //这个是可输入的最大长度,根据项目需求修改
    private static final int STRING_LENGTH = 7;//
    //构造器
    public KeyBoardView(Activity activity) {
        this.activity = activity;
        init();
    }
    //初始化keyvalues的值为0
    private void initKeyValues() {
        keyValues = DEFAULT;
        refreshView();
    }
    //进行视图刷新
    private void refreshView() {
        input_content.setText(keyValues == null || "".equals(keyValues) ? DEFAULT : keyValues);
    }
    //设置值
    //value的值有 
    //         1~9 .  没什么说的了
    //         CLR    长按清除按钮 ,清空keyvalues
    //         CL     点击清除按钮 ,删除最后一个  
    private void setKeyValues(String value) {

        if ("CLR".equals(value)){//清空
            initKeyValues();
            return;
        }
        if ("CL".equals(value)){
            keyValues = keyValues.substring(0,keyValues.length()-1);//把最后一个字符截取调
            value="";//把他置为空字符串,这样再继续执行代码时 "CL"就不会影响计算了
        }
        if (".".equals(value)&&keyValues.indexOf(".")!=-1){
            //如果keyvalues中已经有了“.”,就不能再加了
                return;
        }
        //最新值 = 上次的值+输入的值
        String tmpValue = keyValues+value;
        if (tmpValue.length()>STRING_LENGTH){
            //如果超过了最大长度就return
            return;
        }
        if (tmpValue.indexOf(".")!=-1){//那就是小数了
            keyValues = tmpValue;//原来的值不动
        }else{//整数
            int tmpValueInt = Integer.parseInt(tmpValue==null||"".equals(tmpValue)?"0":tmpValue);
            keyValues=""+tmpValueInt;
        }
        refreshView();
    }
    //初始化
    private void init() {
        LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        conentView = inflater.inflate(R.layout.layout_key_pop, null);
        one = (TextView) conentView.findViewById(R.id.one);
        input_content = (TextView) conentView.findViewById(R.id.input_content);
        two = (TextView) conentView.findViewById(R.id.two);
        clear = (TextView) conentView.findViewById(R.id.clear);
        three = (TextView) conentView.findViewById(R.id.three);
        four = (TextView) conentView.findViewById(R.id.four);
        five = (TextView) conentView.findViewById(R.id.five);
        six = (TextView) conentView.findViewById(R.id.six);
        seven = (TextView) conentView.findViewById(R.id.seven);
        eight = (TextView) conentView.findViewById(R.id.eight);
        nine = (TextView) conentView.findViewById(R.id.nine);
        zero = (TextView) conentView.findViewById(R.id.zero);
        point = (TextView) conentView.findViewById(R.id.point);
        equals = (TextView) conentView.findViewById(R.id.equal);
        one.setOnClickListener(this);
        two.setOnClickListener(this);
        three.setOnClickListener(this);
        four.setOnClickListener(this);
        five.setOnClickListener(this);
        six.setOnClickListener(this);
        seven.setOnClickListener(this);
        eight.setOnClickListener(this);
        nine.setOnClickListener(this);
        zero.setOnClickListener(this);
        point.setOnClickListener(this);
        equals.setOnClickListener(this);
        clear.setOnClickListener(this);
        clear.setOnLongClickListener(this);
        int h = activity.getWindowManager().getDefaultDisplay().getHeight();//没用上..
        int w = activity.getWindowManager().getDefaultDisplay().getWidth();//没用上..
        // 设置SelectPicPopupWindow的View
        this.setContentView(conentView);
        // 设置SelectPicPopupWindow弹出窗体的宽
//        this.setWidth(w);
        this.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
        // 设置SelectPicPopupWindow弹出窗体的高
        this.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
        // 设置SelectPicPopupWindow弹出窗体可点击
        this.setFocusable(true);
        this.setOutsideTouchable(true);
        // 刷新状态
        this.update();
        // 实例化一个ColorDrawable颜色为半透明
        ColorDrawable dw = new ColorDrawable(0000000000);
        // 点back键和其他地方使其消失,设置了这个才能触发OnDismisslistener ,设置其他控件变化等操作
        this.setBackgroundDrawable(dw);
        // mPopupWindow.setAnimationStyle(android.R.style.Animation_Dialog);
        // 设置SelectPicPopupWindow弹出窗体动画效果
//        this.setAnimationStyle(R.style.AnimationToast);
    }

    public void showPopupWindow(View parent) {
        if (!this.isShowing()) {
            clickView = parent;
            initKeyValues();
//            this.showAtLocation(parent, Gravity.BOTTOM, 0, 0);
            this.showAsDropDown(parent);
        } else {
            this.dismiss();
        }
    }

    public void dismissPopWindow() {
        if (isShowing()) {
            dismiss();
        }
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.one:setKeyValues("1");break;
            case R.id.two:setKeyValues("2");
                break;
            case R.id.three:setKeyValues("3");
                break;
            case R.id.four:setKeyValues("4");
                break;
            case R.id.five:setKeyValues("5");
                break;
            case R.id.six:setKeyValues("6");
                break;
            case R.id.seven:setKeyValues("7");
                break;
            case R.id.eight:setKeyValues("8");
                break;
            case R.id.nine:setKeyValues("9");
                break;
            case R.id.zero:setKeyValues("0");
                break;
            case R.id.point:setKeyValues(".");
                break;
            case R.id.equal:
                dismissPopWindow();
                if (keyInputListener!=null){
                //如果用户最后输入.时 比如 12345. ,这时候点击“完成”我们返回的字符串就是"12345.",无论是显示还是计算都是不好看的,我这里的处理是在末尾补0,如果项目需求不是可以将此删除掉
                    if (keyValues.indexOf(".")==keyValues.length()-1){
                        keyValues = keyValues+"0";
                    }else{
                        if (keyValues.indexOf(".")!=-1){
                            //是double
                            double value = Double.parseDouble(keyValues);
                            if (value==0d){
                                keyValues = "0.0";
                            }
                        }
                    }
                    keyInputListener.onFinish(clickView,keyValues);
                }
                break;
            case R.id.clear:
                setKeyValues("CL");//删除最后一个元素
                break;
        }
    }

    @Override
    public boolean onLongClick(View v) {
        setKeyValues("CLR");//长按清除
        return true;//只执行长按事件
    }

    //这个是自定义一个监听器,主要是用于当用户点完成将输入的数据返回
    public interface OnKeyInputListener{
        //当用户点击“完成”时会调用此方法
        //参数view:这个是你在activity点击的控件的对象
        //参数value:这个就是keyValues值
        public void onFinish(View view, String value);
    }

    private OnKeyInputListener keyInputListener;
    //监听器Getter
    public OnKeyInputListener getKeyInputListener() {
        return keyInputListener;
    }
    //监听器Setter
    public void setKeyInputListener(OnKeyInputListener keyInputListener) {
        this.keyInputListener = keyInputListener;
    }

}

2、键盘布局 layout_key_pop.xml

<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/key_layout_bg"
    android:columnCount="3"
    android:orientation="horizontal"
    android:rowCount="6">

        <TextView
            android:id="@+id/input_content"
            android:layout_width="244dip"
            android:layout_height="60dip"
            android:layout_marginLeft="5dip"
            android:textSize="30dip"
            android:text="1234567889"
            android:textStyle="bold|italic"
            android:layout_columnSpan="3"
            android:layout_gravity="fill"
            android:paddingRight="5dip"
            android:gravity="center|right" />





    <TextView
        android:id="@+id/one"
        style="@style/keyStyle"
        android:layout_width="120dip"
        android:layout_height="60dip"

        android:text="1" />
      

    <TextView
        android:id="@+id/two"
        style="@style/keyStyle"
        android:layout_width="120dip"
        android:layout_height="60dip"
        android:text="2" />
       

    <TextView
        android:id="@+id/three"
        style="@style/keyStyle"
        android:layout_width="120dip"
        android:layout_height="60dip"
        android:text="3" />

      

    <TextView
        android:id="@+id/four"
        style="@style/keyStyle"
        android:layout_width="120dip"
        android:layout_height="60dip"
        android:text="4" />
      

    <TextView
        android:id="@+id/five"
        style="@style/keyStyle"
        android:layout_width="120dip"
        android:layout_height="60dip"
        android:text="5" />
      

    <TextView
        android:id="@+id/six"
        style="@style/keyStyle"
        android:layout_width="120dip"
        android:layout_height="60dip"
        android:text="6" />
      

    <TextView
        android:id="@+id/seven"
        style="@style/keyStyle"
        android:layout_width="120dip"
        android:layout_height="60dip"
        android:text="7" />
      

    <TextView
        android:id="@+id/eight"
        style="@style/keyStyle"
        android:layout_width="120dip"
        android:layout_height="60dip"
        android:text="8" />
      

    <TextView
        android:id="@+id/nine"
        style="@style/keyStyle"
        android:layout_width="120dip"
        android:layout_height="60dip"
        android:text="9" />


      

    <TextView
        android:id="@+id/point"
        style="@style/keyStyle"
        android:layout_width="120dip"
        android:layout_height="60dip"
        android:text="." />
    <TextView
        android:id="@+id/zero"
        style="@style/keyStyle"
        android:layout_width="120dip"
        android:layout_height="60dip"
        android:text="0" />
    <TextView
        android:id="@+id/clear"
        style="@style/keyStyle"
        android:layout_width="120dip"
        android:layout_height="60dip"
        android:text="清除" />
    <TextView
        android:id="@+id/equal"
        style="@style/keyStyle"
        android:layout_height="70dip"
        android:layout_columnSpan="3"
        android:layout_gravity="fill"
        android:background="@drawable/key_selector_func"
        android:text="完成"
        android:textColor="#fff"/>
</GridLayout>

style.xml文件

 <style name="keyStyle">
        <item name="android:background">@drawable/key_selector_nums</item>
        <item name="android:layout_margin">2dip</item>
        <item name="android:textSize">20dip</item>
        <item name="android:gravity">center</item>
    </style>

注:所有的drawable文件我就不细说了,就是个样式。


4、使用

 private void OnClick(View view) {
        switch (view.getId()) {
            case R.id.text1:
                //控件的点击事件里显示键盘
                keyBoardView.showPopupWindow(view);
                break;


        }
    }
KeyBoardView keyBoardView;
//onCreate中
keyBoardView = new KeyBoardView(this);
keyBoardView.setKeyInputListener(new KeyBoardView.OnKeyInputListener() {
            @Override
            public void onFinish(View view, String value) {
                switch (view.getId()){
                    case R.id.text1:
                        text1.setText(value);
                        break;
                    case R.id.text2:
                        text2.setText(value);
                        break;
                }
            }
        });
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

英杰丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值