自定义键盘



先看界面布局文件
代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<? xml version = "1.0" encoding = "utf-8" ?>
< LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
    android:layout_width = "fill_parent"
    android:layout_height = "fill_parent"
    android:orientation = "vertical" >
    < EditText
        android:id = "@+id/edit"
        android:layout_width = "fill_parent"
        android:layout_height = "wrap_content" />
    < EditText
        android:id = "@+id/edit1"
        android:layout_width = "fill_parent"
        android:layout_height = "wrap_content"
        android:password = "true" />
    < RelativeLayout
        android:layout_width = "fill_parent"
        android:layout_height = "wrap_content" >
        < android.inputmethodservice.KeyboardView
            android:id = "@+id/keyboard_view"
            android:layout_width = "fill_parent"
            android:layout_height = "wrap_content"
            android:layout_alignParentBottom = "true"
            android:focusable = "true"
            android:focusableInTouchMode = "true"
            android:background = "@color/lightblack"
            android:keyBackground = "@drawable/btn_keyboard_key"
            android:keyTextColor = "@color/white"
            android:visibility = "gone" />
    </ RelativeLayout >
</ LinearLayout >

通过布局文件可以看出界面上有两个输入框,其中一个是密码输入框,界面上还有一个隐藏的键盘控件。
在res下新建xml文件夹,在xml文件夹中新建qwerty.xml和symbols.xml文件. qwerty.xml 是字母键盘布局,symbols.xml 是数字键盘布局,内如如下
qwerty.xml内容
代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<? xml version = "1.0" encoding = "UTF-8" ?>
< Keyboard android:keyWidth = "10.000002%p" android:keyHeight = "@dimen/key_height"
        android:horizontalGap = "0.0px" android:verticalGap = "0.0px"
        xmlns:android = "http://schemas.android.com/apk/res/android" >
        < Row >
                < Key android:codes = "113" android:keyEdgeFlags = "left"
                        android:keyLabel = "q" />
                < Key android:codes = "119" android:keyLabel = "w" />
                < Key android:codes = "101" android:keyLabel = "e" />
                < Key android:codes = "114" android:keyLabel = "r" />
                < Key android:codes = "116" android:keyLabel = "t" />
                < Key android:codes = "121" android:keyLabel = "y" />
                < Key android:codes = "117" android:keyLabel = "u" />
                < Key android:codes = "105" android:keyLabel = "i" />
                < Key android:codes = "111" android:keyLabel = "o" />
                < Key android:codes = "112" android:keyEdgeFlags = "right"
                        android:keyLabel = "p" />
        </ Row >
        < Row >
                < Key android:horizontalGap = "4.999995%p" android:codes = "97"
                        android:keyEdgeFlags = "left" android:keyLabel = "a" />
                < Key android:codes = "115" android:keyLabel = "s" />
                < Key android:codes = "100" android:keyLabel = "d" />
                < Key android:codes = "102" android:keyLabel = "f" />
                < Key android:codes = "103" android:keyLabel = "g" />
                < Key android:codes = "104" android:keyLabel = "h" />
                < Key android:codes = "106" android:keyLabel = "j" />
                < Key android:codes = "107" android:keyLabel = "k" />
                < Key android:codes = "108" android:keyEdgeFlags = "right"
                        android:keyLabel = "l" />
        </ Row >
        < Row >
                < Key android:keyWidth = "14.999998%p" android:codes = "-1"
                        android:keyEdgeFlags = "left" android:isModifier = "true"
                        android:isSticky = "true" android:keyIcon = "@drawable/sym_keyboard_shift" />
                < Key android:codes = "122" android:keyLabel = "z" />
                < Key android:codes = "120" android:keyLabel = "x" />
                < Key android:codes = "99" android:keyLabel = "c" />
                < Key android:codes = "118" android:keyLabel = "v" />
                < Key android:codes = "98" android:keyLabel = "b" />
                < Key android:codes = "110" android:keyLabel = "n" />
                < Key android:codes = "109" android:keyLabel = "m" />
                < Key android:keyWidth = "14.999998%p" android:codes = "-5"
                        android:keyEdgeFlags = "right" android:isRepeatable = "true"
                        android:keyIcon = "@drawable/sym_keyboard_delete" />
        </ Row >
        < Row android:rowEdgeFlags = "bottom" >
                < Key android:keyWidth = "20.000004%p" android:codes = "-2"
                        android:keyLabel = "12#" />
                < Key android:keyWidth = "14.999998%p" android:codes = "44"
                        android:keyLabel = "," />
                < Key android:keyWidth = "29.999996%p" android:codes = "32"
                        android:isRepeatable = "true" android:keyIcon = "@drawable/sym_keyboard_space" />
                < Key android:keyWidth = "14.999998%p" android:codes = "46"
                        android:keyLabel = "." />
                < Key android:keyWidth = "20.000004%p" android:codes = "-3"
                        android:keyEdgeFlags = "right" android:keyLabel = "完成" />
        </ Row >
</ Keyboard >

symbols.xml 内容
代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<? xml version = "1.0" encoding = "utf-8" ?>
< Keyboard xmlns:android = "http://schemas.android.com/apk/res/android"
        android:keyWidth = "25%p" android:horizontalGap = "0px"
        android:verticalGap = "0px" android:keyHeight = "@dimen/key_height" >
        < Row >
                < Key android:codes = "49" android:keyLabel = "1" />
                < Key android:codes = "50" android:keyLabel = "2" />
                < Key android:codes = "51" android:keyLabel = "3" />
                < Key android:codes = "57419" android:keyEdgeFlags = "right"
                        android:keyIcon = "@drawable/sym_keyboard_left" />
        </ Row >
        < Row >
                < Key android:codes = "52" android:keyLabel = "4" />
                < Key android:codes = "53" android:keyLabel = "5" />
                < Key android:codes = "54" android:keyLabel = "6" />
                < Key android:codes = "57421" android:keyEdgeFlags = "right"
                        android:keyIcon = "@drawable/sym_keyboard_right" />
        </ Row >
        < Row >
                < Key android:codes = "55" android:keyLabel = "7" />
                < Key android:codes = "56" android:keyLabel = "8" />
                < Key android:codes = "57" android:keyLabel = "9" />
                < Key android:codes = "-3" android:keyHeight = "100dip"
                        android:keyEdgeFlags = "right" android:isRepeatable = "true"
                        android:keyLabel = "完成" />
        </ Row >
        < Row >
                < Key android:codes = "-2" android:keyLabel = "ABC" />
                < Key android:codes = "48" android:keyLabel = "0" />
                < Key android:codes = "-5" android:keyIcon = "@drawable/sym_keyboard_delete" />
        </ Row >
</ Keyboard >


KeydemoActivity.java
代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package cn.key;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.text.InputType;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.EditText;
public class KeydemoActivity extends Activity {
        private Context ctx;
        private Activity act;
        private EditText edit;
        private EditText edit1;
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super .onCreate(savedInstanceState);
                setContentView(R.layout.main);
                ctx = this ;
                act = this ;
                edit = (EditText) this .findViewById(R.id.edit);
                edit.setInputType(InputType.TYPE_NULL);
                edit1 = (EditText) this .findViewById(R.id.edit1);
                edit.setOnTouchListener( new OnTouchListener() {
                        @Override
                        public boolean onTouch(View v, MotionEvent event) {
                                new KeyboardUtil(act, ctx, edit).showKeyboard();
                                return false ;
                        }
                });
                edit1.setOnTouchListener( new OnTouchListener() {
                        @Override
                        public boolean onTouch(View v, MotionEvent event) {
                                int inputback = edit1.getInputType();
                                edit1.setInputType(InputType.TYPE_NULL);
                                new KeyboardUtil(act, ctx, edit1).showKeyboard();
                                edit1.setInputType(inputback);
                                return false ;
                        }
                });
        }
}


KeyboardUtil.java
代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
package cn.key;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.inputmethodservice.Keyboard;
import android.inputmethodservice.KeyboardView;
import android.inputmethodservice.Keyboard.Key;
import android.inputmethodservice.KeyboardView.OnKeyboardActionListener;
import android.text.Editable;
import android.view.View;
import android.widget.EditText;
public class KeyboardUtil {
        private Context ctx;
        private Activity act;
        private KeyboardView keyboardView;
        private Keyboard k1; // 字母键盘
        private Keyboard k2; // 数字键盘
        public boolean isnun = false ; // 是否数据键盘
        public boolean isupper = false ; // 是否大写
        private EditText ed;
        public KeyboardUtil(Activity act, Context ctx, EditText edit) {
                this .act = act;
                this .ctx = ctx;
                this .ed = edit;
                k1 = new Keyboard(ctx, R.xml.qwerty);
                k2 = new Keyboard(ctx, R.xml.symbols);
                keyboardView = (KeyboardView) act.findViewById(R.id.keyboard_view);
                keyboardView.setKeyboard(k1);
                keyboardView.setEnabled( true );
                keyboardView.setPreviewEnabled( true );
                keyboardView.setOnKeyboardActionListener(listener);
        }
        private OnKeyboardActionListener listener = new OnKeyboardActionListener() {
                @Override
                public void swipeUp() {
                }
                @Override
                public void swipeRight() {
                }
                @Override
                public void swipeLeft() {
                }
                @Override
                public void swipeDown() {
                }
                @Override
                public void onText(CharSequence text) {
                }
                @Override
                public void onRelease( int primaryCode) {
                }
                @Override
                public void onPress( int primaryCode) {
                }
                @Override
                public void onKey( int primaryCode, int [] keyCodes) {
                        Editable editable = ed.getText();
                        int start = ed.getSelectionStart();
                        if (primaryCode == Keyboard.KEYCODE_CANCEL) { // 完成
                                hideKeyboard();
                        } else if (primaryCode == Keyboard.KEYCODE_DELETE) { // 回退
                                if (editable != null && editable.length() > 0 ) {
                                        if (start > 0 ) {
                                                editable.delete(start - 1 , start);
                                        }
                                }
                        } else if (primaryCode == Keyboard.KEYCODE_SHIFT) { // 大小写切换
                                changeKey();
                                keyboardView.setKeyboard(k1);
                        } else if (primaryCode == Keyboard.KEYCODE_MODE_CHANGE) { // 数字键盘切换
                                if (isnun) {
                                        isnun = false ;
                                        keyboardView.setKeyboard(k1);
                                } else {
                                        isnun = true ;
                                        keyboardView.setKeyboard(k2);
                                }
                        } else if (primaryCode == 57419 ) { // go left
                                if (start > 0 ) {
                                        ed.setSelection(start - 1 );
                                }
                        } else if (primaryCode == 57421 ) { // go right
                                if (start < ed.length()) {
                                        ed.setSelection(start + 1 );
                                }
                        } else {
                                editable.insert(start, Character.toString(( char ) primaryCode));
                        }
                }
        };
       
        /**
         * 键盘大小写切换
         */
        private void changeKey() {
                List<Key> keylist = k1.getKeys();
                if (isupper) { //大写切换小写
                        isupper = false ;
                        for (Key key:keylist){
                                if (key.label!= null && isword(key.label.toString())) {
                                        key.label = key.label.toString().toLowerCase();
                                        key.codes[ 0 ] = key.codes[ 0 ]+ 32 ;
                                }
                        }
                } else { //小写切换大写
                        isupper = true ;
                        for (Key key:keylist){
                                if (key.label!= null && isword(key.label.toString())) {
                                        key.label = key.label.toString().toUpperCase();
                                        key.codes[ 0 ] = key.codes[ 0 ]- 32 ;
                                }
                        }
                }
        }
    public void showKeyboard() {
        int visibility = keyboardView.getVisibility();
        if (visibility == View.GONE || visibility == View.INVISIBLE) {
            keyboardView.setVisibility(View.VISIBLE);
        }
    }
   
    public void hideKeyboard() {
        int visibility = keyboardView.getVisibility();
        if (visibility == View.VISIBLE) {
            keyboardView.setVisibility(View.INVISIBLE);
        }
    }
   
    private boolean isword(String str){
            String wordstr = "abcdefghijklmnopqrstuvwxyz" ;
            if (wordstr.indexOf(str.toLowerCase())>- 1 ) {
                        return true ;
                }
            return false ;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值