本文来自阿钟的投稿,全文阅读大约十分钟

为了便于用户快捷的输入车牌号码便需要自定义个车牌键盘,而不是使用系统的键盘输入,上效果图:

横屏效果

图片

竖屏效果

图片

一、首先我们要来分析一下需要做哪些东西

  • 默认展示车牌的省份简称

  • 特殊车牌(使、领、警、港、澳)

  • 删除键

  • 切换为数字和字母按键

  • 车牌号中是没有I、O字母的(容易与1、0)分混淆,故不需要这两个按键

  • I、O这两个按键的位置正好使用学、挂来填充

二、根据效果图可以看出键盘就是个网格列表,所以很容易就想到使用`RecyclerView`来实现即简单又高效

  • 创建个LicensePlateView类继承自LinearLayout

  • 我们需要定义我们的按键资源

在`string.xml`文件中定义我们的资源

  • 简称

 1<array name="province"> 2    <item>京item> 3    <item>沪item> 4    <item>浙item> 5    <item>苏item> 6    <item>粤item> 7    <item>鲁item> 8    <item>晋item> 9    <item>冀item>10    <item>豫item>11    <item>川item>12    <item>渝item>13    <item>辽item>14    <item>吉item>15    <item>黑item>16    <item>皖item>17    <item>鄂item>18    <item>湘item>19    <item>赣item>20    <item>闽item>21    <item>陕item>22    <item>甘item>23    <item>宁item>24    <item>蒙item>25    <item>津item>26    <item>贵item>27    <item>云item>28    <item>桂item>29    <item>琼item>30    <item>青item>31    <item>Delitem>32    <item>item>33    <item>新item>34    <item>藏item>35    <item>使item>36    <item>领item>37    <item>警item>38    <item>港item>39    <item>澳item>40    <item>ABC\n123item>41array>
  • 数字、字母

 1<array name="nums"> 2    <item>"0"item> 3    <item>"1"item> 4    <item>"2"item> 5    <item>"3"item> 6    <item>"4"item> 7    <item>"5"item> 8    <item>"6"item> 9    <item>"7"item>10    <item>"8"item>11    <item>"9"item>12    <item>Qitem>13    <item>Witem>14    <item>Eitem>15    <item>Ritem>16    <item>Titem>17    <item>Yitem>18    <item>Uitem>19    <item>学item>20    <item>挂item>21    <item>Pitem>22    <item>Aitem>23    <item>Sitem>24    <item>Ditem>25    <item>Fitem>26    <item>Gitem>27    <item>Hitem>28    <item>Jitem>29    <item>Kitem>30    <item>Litem>31    <item>Delitem>32    <item>item>33    <item>Zitem>34    <item>Xitem>35    <item>Citem>36    <item>Vitem>37    <item>Bitem>38    <item>Nitem>39    <item>Mitem>40    <item>省item>41array>

`这里需要特别注意,定义数字的时候需要给它加上" ",否则代码获取的为null`

  • 键盘的最后一行第一个是需要空开来的,所以直接使用个空字符串占位即可。

三、 编写每个按键的布局

 1<?xml  version="1.0" encoding="utf-8"?> 2<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3    android:layout_width="match_parent" 4    android:layout_height="35dp" 5    android:background="@drawable/sel_white_radius_2" 6    android:gravity="center"> 7    <TextView 8        android:id="@+id/tv_key" 9        android:layout_width="wrap_content"10        android:layout_height="match_parent"11        android:gravity="center"12        android:lineSpacingMultiplier="0.8"13        android:text="京"14        android:textColor="#333333"15        android:textSize="16sp" />16LinearLayout>

四、通过代码动态创建一个`RecyclerView`

  • LicensePlateView

  1public class LicensePlateView extends LinearLayout implements View.OnClickListener {  2    /**  3     * 车牌简称  4     */  5    private List provinceList = new ArrayList<>();  6    /**  7     * 0~9,A~Z(车牌里没有I、O字母)  8     */  9    private List numList = new ArrayList<>(); 10    /** 11     * 键盘的背景颜色 12     */ 13    private final int backgroundColor = Color.parseColor("#e9e9e9"); 14    /** 15     * 键盘文字颜色 16     */ 17    private final int keyTextColor = Color.parseColor("#333333"); 18    /** 19     * 键盘列数 20     */ 21    private final int spanCount = 10; 22    /** 23     * 键盘 键的间隔 24     */ 25    private final int keyButtonMargin = 15; 26    /** 27     * 键盘上下左右的边距 28     */ 29    private final int keyboardPadding = 10; 30    /** 31     * 按键点击回调 32     */ 33    private OnKeyClickListener onKeyClickListener; 34    private KeyAdapter keyAdapter; 35    public LicensePlateView(Context context) { 36        super(context); 37        init(context); 38    } 39 40    public LicensePlateView(Context context, @Nullable AttributeSet attrs) { 41        super(context, attrs); 42        init(context); 43    } 44    private void init(Context context) { 45        setOrientation(LinearLayout.VERTICAL); 46        setBackgroundColor(backgroundColor); 47        initKeys(); 48        RecyclerView recyclerView = new RecyclerView(context); 49        recyclerView.setOverScrollMode(OVER_SCROLL_NEVER); 50        recyclerView.setLayoutManager(new GridLayoutManager(context, spanCount)); 51        recyclerView.addItemDecoration(new RecycleGridDivider(keyButtonMargin)); 52        int padding = dip2px(context, keyboardPadding); 53        recyclerView.setPadding(padding, padding, padding, padding); 54        addView(recyclerView); 55        keyAdapter = new KeyAdapter(this); 56        recyclerView.setAdapter(keyAdapter); 57        keyAdapter.setNewData(provinceList); 58    } 59    /** 60     * 初始化按键 61     */ 62    private void initKeys() { 63        String[] province = getResources().getStringArray(R.array.province); 64        String[] num = getResources().getStringArray(R.array.nums); 65        Collections.addAll(provinceList, province); 66        Collections.addAll(numList, num); 67    } 68    /** 69     * 按键点击事件 70     */ 71    @Override 72    public void onClick(View v) { 73        TextView tvKey = v.findViewById(R.id.tv_key); 74        String key = tvKey.getText().toString(); 75        if (key.equals("ABC\n123")) { 76            //键盘切换 77            keyAdapter.setNewData(numList); 78            return; 79        } else if (key.equals("省")) { 80            keyAdapter.setNewData(provinceList); 81            return; 82        } 83        if (onKeyClickListener != null) { 84            onKeyClickListener.onKeyClick(key); 85        } 86    } 87    private class KeyAdapter extends RecyclerView.Adapter { 88        private List list = new ArrayList<>(); 89        private OnClickListener listener; 90        public KeyAdapter(OnClickListener listener) { 91            this.listener = listener; 92        } 93        @NonNull 94        @Override 95        public KeyAdapter.KeyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { 96            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_key, parent, false); 97            return new KeyViewHolder(view); 98        } 99100        @Override101        public void onBindViewHolder(@NonNull KeyAdapter.KeyViewHolder holder, int position) {102            String key = list.get(position);103            holder.tvKey.setText(key);104            holder.itemView.setOnClickListener(listener);105            if (TextUtils.isEmpty(key)) {106                holder.itemView.setBackgroundResource(0);107                //键盘类型切换按键108            } else if (key.equals("ABC\n123") || key.equals("省")) {109                holder.tvKey.setTextSize(10);110                holder.itemView.setBackgroundResource(R.drawable.sel_blue_radius_2);111                holder.tvKey.setTextColor(Color.WHITE);112            } else {113                holder.tvKey.setTextSize(12);114                holder.itemView.setBackgroundResource(R.drawable.sel_white_radius_2);115                holder.tvKey.setTextColor(keyTextColor);116            }117        }118        @Override119        public int getItemCount() {120            return list.size();121        }122        public void setNewData(List list) {123            this.list.clear();124            this.list.addAll(list);125            notifyDataSetChanged();126        }127        private class KeyViewHolder extends RecyclerView.ViewHolder {128            private TextView tvKey;129            public KeyViewHolder(@NonNull View itemView) {130                super(itemView);131                tvKey = itemView.findViewById(R.id.tv_key);132            }133        }134    }135    public class RecycleGridDivider extends RecyclerView.ItemDecoration {136        /**137         * 分割线宽度138         */139        private int space;140141        public RecycleGridDivider(int space) {142            this.space = space;143        }144        @Override145        public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {146            GridLayoutManager manager = (GridLayoutManager) parent.getLayoutManager();147            int span = manager.getSpanCount();148            //为了Item大小均匀,将设定分割线平均分给左右两边Item各一半149            int offset = space / 2;150            //得到View的位置151            int childPosition = parent.getChildAdapterPosition(view);152            //第一排,顶部不画153            if (childPosition 154                //最左边的,左边不画155                if (childPosition % span == 0) {156                    outRect.set(0, 0, offset, 0);157                    //最右边,右边不画158                } else if (childPosition % span == span - 1) {159                    outRect.set(offset, 0, 0, 0);160                } else {161                    outRect.set(offset, 0, offset, 0);162                }163            } else {164                //上下的分割线,就从第二排开始,每个区域的顶部直接添加设定大小,不用再均分了165                if (childPosition % span == 0) {166                    outRect.set(0, space, offset, 0);167                } else if (childPosition % span == span - 1) {168                    outRect.set(offset, space, 0, 0);169                } else {170                    outRect.set(offset, space, offset, 0);171                }172            }173        }174    }175    /**176     * 设置按键点击事件177     */178    public void setOnKeyClickListener(OnKeyClickListener listener) {179        this.onKeyClickListener = listener;180    }181    public interface OnKeyClickListener {182        void onKeyClick(String key);183    }184    /**185     * 根据手机的分辨率从 dp 的单位 转成为 px(像素)186     */187    public static int dip2px(Context context, float dpValue) {188        final float scale = context.getResources().getDisplayMetrics().density;189        return (int) (dpValue * scale + 0.5f);190    }191}

四、对于我们需要输入车牌的`EditText`,需要它禁止弹出系统键盘;设置如下:

1//禁止输入框弹出键盘2etPlate.setInputType(InputType.TYPE_NULL);3etPlate.setKeyListener(null);

五、封装好后使用就很简单了

 1LicensePlateView plateView = findViewById(R.id.plate_view); 2plateView.setOnKeyClickListener(new LicensePlateView.OnKeyClickListener() { 3    @Override 4    public void onKeyClick(String key) { 5        Editable editable = etPlate.getText(); 6        int start = etPlate.getSelectionStart(); 7        if (key.equalsIgnoreCase("Del")) { 8            if (editable.length() > 0 && start > 0) { 9                editable.delete(start - 1, start);10            }11            return;12        }13        editable.insert(start, key);14    }15});

总体来说这个View还是很简单的

Demo下载地址:

https://download.csdn.net/download/a_zhon/11646110

推荐我的慕课网Android实战课程,助你暴力提升Android技术。

https://coding.imooc.com/class/390.html

我创建了一个关于Android的交流群,有兴趣可以加我微信我拉你

图片

如果感觉现在的网络技术文章质量不高,苦于自己的Android技术无法得到明显的提升,感叹没有一帮好的学习伙伴及道友,那么我的知识星球可能就是一片净土,好的学习气氛,更好的技术资源与文章,自由且高效率,快来吧。

图片

android 自定义键盘_Android自定义输入车牌号键盘、车牌简称,数字 ,字母键盘...相关推荐

  1. 微信小程序 - 实现车牌输入功能,自定义车牌号输入法组件(键盘弹出后输入车牌号,可自定义各地区及界面样式)超详细注释组件插件示例源码

    效果图 本文实现了 输入车牌号码专用键盘组件,高效简洁无 BUG, 你可以直接复制组件源码,干净整洁的代码轻松移植到自己的项目中. 如下图所示,本文提供这样一个组件供你复制,快速完成功能. 组件源码 ...

  2. 微信小程序 输入车牌号(有新能源)

    微信小程序 输入车牌号(有新能源) <view class="page"><!-- 车牌号码输入框 --><view class="carN ...

  3. 微信小程序 自助停车,输入车牌号功能实现

    话不多说,先上效果图 效果图 ( 改一改h5也能用 ) 功能列表 根据输入位置自动显示下方键盘为候选地区或数字字母 输入位置后自动跳转至下一位 删除号码后自动返回上一位 点击可选填新能源号码 代码复现 ...

  4. android EditText限制输入框只能输入某些特殊字符、汉字、数字、英文字母等

    android EditText限制输入框只能输入某些特殊字符.汉字.数字.英文字母等 方法一:在EditText里面设置属性digits,其内容为可以输入的符号,其他的符号不可输入(不能设置中文) ...

  5. 教你看懂车牌号——全国车牌详解细表

    教你看懂车牌号--全国车牌详解细表 北京市(京)  A  B(出租车)  C  E  F  H  G(远郊区县)  天津市(津)  A  B  C  E(出租车)  河北省(冀)  A 石家庄市 B ...

  6. uniapp 车牌号输入 车牌号键盘 新能源车牌键盘 特殊车辆车牌键盘

    1:效果图 2:代码: <template><view class="container"><view class="car_type_bo ...

  7. java web自定义监听器_Android自定义监听器Listener(自定义Java Callback回调事件)

    Callback回调事件介绍 Java或Android中创建异步回调最普遍的做法就是使用listener监听器或者observer观察者模式来解决,listener回调事件通常用于实现一个代码去监听另 ...

  8. OC仿支付宝输入UITextField输入车牌号

    效果图,如果使用,出现任何问题请告知,或者下方留言,我好以及改正 .h文件: #import <UIKit/UIKit.h>@interface LicenseKeyBoardView : ...

  9. android java 圆角_Android自定义View实现带4圆角或者2圆角的效果

    1 问题 实现任意view经过自定义带4圆角或者2圆角的效果 2 原理 1) 实现view 4圆角 我们只需要把左边的图嵌入到右边里面去,最终显示左边的图就行. 2) 实现view上2圆角 我们只需要 ...

最新文章

  1. 让我们来开发一种更类似人脑的神经网络吧(五)
  2. 2021“MINIEYE杯”中国大学生算法设计超级联赛(7)部分题解
  3. 职高计算机选修6知识点,(计算机基础考试7.doc
  4. Chap-4 Section 4.2.4 指令修正方式
  5. Android Studio、 补充知识以及主要组件
  6. 多态和类属性、类方法
  7. 看 设计模式之策略模式探讨初步 有感,并摘取部份内容,学习之
  8. 提高局域网速度的21招
  9. linux Sprintf中文乱码,Linux下printf、fprintf、sprintf的区别
  10. 谷歌浏览器显示弹框登陆代理解决方法
  11. 计算机桌面变小了是怎么回事啊,电脑桌面整体变小了要怎么调回来的
  12. libaio介绍和使用
  13. 步进电机驱动器怎么设置细分
  14. 矩阵转置---c语言实现
  15. 小米迎来NLP首席科学家王斌:中科院研究员,雷军崔宝秋亲学弟
  16. Java 获取访问者的IP地址
  17. 软件工程--沃尔沃物流信息系统tp5实现源码
  18. python unescape函数_Python中unescape JavaScript中escape的字符
  19. 微信分享 传递数据 接收收据
  20. 复用Oracle数据文件,Oracle控制文件的备份、恢复以及多路复用

热门文章

  1. 在此处打开命令窗口_这样操作方便多了!简单DOS命令实用技巧详解
  2. linux文件类型为ext4怎么扩展,如何扩展ext4分区和文件系统?
  3. python程序跑得慢_Python程序慢的重要原因
  4. MobileNets论文阅读笔记
  5. JAVA_OPTS 参数
  6. Stage4--Python面向对象
  7. [译]开始对Angular App进行单元测试(1)
  8. 比赛--建金字塔问题--解题报告
  9. 正则表达式中空格的危害
  10. Cisco交换机路由器的部分命令解析(3)