本文來自阿鐘的投稿,全文閱讀大約十分鐘
為了便于用戶快捷的輸入車牌號碼便需要自定義個車牌鍵盤,而不是使用系統的鍵盤輸入,上效果圖:
橫屏效果
圖片
豎屏效果
圖片
一、首先我們要來分析一下需要做哪些東西
二、根據效果圖可以看出鍵盤就是個網格列表,所以很容易就想到使用`RecyclerView`來實現即簡單又高效
在`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>
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>
`這里需要特別注意,定義數字的時候需要給它加上" ",否則代碼獲取的為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>
四、通過代碼動態創建一個`RecyclerView`
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?????*?鍵盤列數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????}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????????????????//上下的分割線,就從第二排開始,每個區域的頂部直接添加設定大小,不用再均分了
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????@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
推薦我的慕課網Android實戰課程,助你暴力提升Android技術。
https://coding.imooc.com/class/390.html
我創建了一個關于Android的交流群,有興趣可以加我微信我拉你
圖片
如果感覺現在的網絡技術文章質量不高,苦于自己的Android技術無法得到明顯的提升,感嘆沒有一幫好的學習伙伴及道友,那么我的知識星球可能就是一片凈土,好的學習氣氛,更好的技術資源與文章,自由且高效率,快來吧。
圖片
總結
以上是生活随笔為你收集整理的Android自定义输入车牌号键盘、车牌简称,数字 ,字母键盘的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。