日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android自定义输入车牌号键盘、车牌简称,数字 ,字母键盘

發(fā)布時間:2023/12/10 Android 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android自定义输入车牌号键盘、车牌简称,数字 ,字母键盘 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本文來自阿鐘的投稿,全文閱讀大約十分鐘


為了便于用戶快捷的輸入車牌號碼便需要自定義個車牌鍵盤,而不是使用系統(tǒng)的鍵盤輸入,上效果圖:

橫屏效果

圖片

豎屏效果

圖片

一、首先我們要來分析一下需要做哪些東西

  • 默認展示車牌的省份簡稱

  • 特殊車牌(使、領、警、港、澳)

  • 刪除鍵

  • 切換為數(shù)字和字母按鍵

  • 車牌號中是沒有I、O字母的(容易與1、0)分混淆,故不需要這兩個按鍵

  • I、O這兩個按鍵的位置正好使用學、掛來填充

二、根據(jù)效果圖可以看出鍵盤就是個網(wǎng)格列表,所以很容易就想到使用`RecyclerView`來實現(xiàn)即簡單又高效

  • 創(chuàng)建個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>Del</item> 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\n123</item> 41</array>
  • 數(shù)字、字母

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>Q</item> 13????<item>W</item> 14????<item>E</item> 15????<item>R</item> 16????<item>T</item> 17????<item>Y</item> 18????<item>U</item> 19????<item>學</item> 20????<item>掛</item> 21????<item>P</item> 22????<item>A</item> 23????<item>S</item> 24????<item>D</item> 25????<item>F</item> 26????<item>G</item> 27????<item>H</item> 28????<item>J</item> 29????<item>K</item> 30????<item>L</item> 31????<item>Del</item> 32????<item></item> 33????<item>Z</item> 34????<item>X</item> 35????<item>C</item> 36????<item>V</item> 37????<item>B</item> 38????<item>N</item> 39????<item>M</item> 40????<item>省</item> 41</array>

`這里需要特別注意,定義數(shù)字的時候需要給它加上" ",否則代碼獲取的為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????<TextView8????????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"?/> 16</LinearLayout>

四、通過代碼動態(tài)創(chuàng)建一個`RecyclerView`

  • LicensePlateView

1public?class?LicensePlateView?extends?LinearLayout?implements?View.OnClickListener?{2????/**3?????*?車牌簡稱4?????*/5????private?List<String>?provinceList?=?new?ArrayList<>();6????/**7?????*?0~9,A~Z(車牌里沒有I、O字母)8?????*/9????private?List<String>?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?????*?鍵盤列數(shù)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?????*?按鍵點擊回調(diào)32?????*/33????private?OnKeyClickListener?onKeyClickListener;34????private?KeyAdapter?keyAdapter;35????public?LicensePlateView(Context?context)?{36????????super(context);37????????init(context);38????}3940????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????@Override72????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<KeyAdapter.KeyViewHolder>?{88????????private?List<String>?list?=?new?ArrayList<>();89????????private?OnClickListener?listener;90????????public?KeyAdapter(OnClickListener?listener)?{91????????????this.listener?=?listener;92????????}93????????@NonNull94????????@Override95????????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????????}99 100????????@Override 101????????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????????@Override 119????????public?int?getItemCount()?{ 120????????????return?list.size(); 121????????} 122????????public?void?setNewData(List<String>?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; 140 141????????public?RecycleGridDivider(int?space)?{ 142????????????this.space?=?space; 143????????} 144????????@Override 145????????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?<?span)?{ 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????????????????//上下的分割線,就從第二排開始,每個區(qū)域的頂部直接添加設定大小,不用再均分了 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?????*?根據(jù)手機的分辨率從?dp?的單位?轉(zhuǎn)成為?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`,需要它禁止彈出系統(tǒng)鍵盤;設置如下:

1//禁止輸入框彈出鍵盤 2etPlate.setInputType(InputType.TYPE_NULL); 3etPlate.setKeyListener(null);

五、封裝好后使用就很簡單了

1LicensePlateView?plateView?=?findViewById(R.id.plate_view);2plateView.setOnKeyClickListener(new?LicensePlateView.OnKeyClickListener()?{3????@Override4????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

推薦我的慕課網(wǎng)Android實戰(zhàn)課程,助你暴力提升Android技術。

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

我創(chuàng)建了一個關于Android的交流群,有興趣可以加我微信我拉你

圖片

如果感覺現(xiàn)在的網(wǎng)絡技術文章質(zhì)量不高,苦于自己的Android技術無法得到明顯的提升,感嘆沒有一幫好的學習伙伴及道友,那么我的知識星球可能就是一片凈土,好的學習氣氛,更好的技術資源與文章,自由且高效率,快來吧。

圖片


總結(jié)

以上是生活随笔為你收集整理的Android自定义输入车牌号键盘、车牌简称,数字 ,字母键盘的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。