android 中自定义软件盘用于特需界面的输入

在做p2p理财项目,有些界面避免有校身份证号码及购买数量的输入,所以采取自定义软件盘的方式来实现更好的输入体验.

那么怎么弹出和隐藏自己自定义的软键盘呢?关键代码如下

if (SDK_INT <= 10) {
            // 屏蔽默认输入法
            edText.setInputType(InputType.TYPE_NULL);

        } else {
            //反射的方法实现避免弹出系统自带的软键盘
            getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
            /**方法一*/
            try {
                Class<EditText> cls = EditText.class;
                java.lang.reflect.Method setShowSoftInputOnFocus;
                
                if (SDK_INT >= 16) {
                    // 4.2
                    setShowSoftInputOnFocus = cls.getMethod("setShowSoftInputOnFocus", boolean.class);
                } else {
                    // 4.0
                    setShowSoftInputOnFocus = cls.getMethod("setSoftInputShownOnFocus", boolean.class);
                }

                setShowSoftInputOnFocus.setAccessible(true);
                setShowSoftInputOnFocus.invoke(edText, false);
            } catch (Exception e) {
                e.printStackTrace();
            }

        }

利用JAVA反射调用  EditText 的私有方法,来避免弹出软键盘 不同android版本的SDK 方法明不一样,这样就成功的避免了系统的软件盘的弹出


EditText添加相关的事件如:


edText.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                if (keyboardUtil == null) {
                    keyboardUtil = new KeyboardUtil(MainActivity.this, MainActivity.this, num);
                    keyboardUtil.setMyOnkeys(myOnkeys);
                }

                keyboardUtil.setEditText(edText);
                switch (edText.getId()) {
                    case R.id.edit:
                        keyboardUtil.displayleftAndright();
                        break;
                    case R.id.edit_num:
                        keyboardUtil.displayleftAndrightNum(num);
                        break;
                }


                keyboardUtil.showKeyboard(bottomView);
            }
        });

如果一个界面有多个EditText 我们还需要监听焦点获取的事件设置当前需要输入的EditText

edText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View view, boolean b) {
                if (b) {
                    if (keyboardUtil != null) {
                        //设置当前获取的EDITTEXT 
                        keyboardUtil.setEditText(edText);
                        switch (edText.getId()) {
                            case R.id.edit:
                                keyboardUtil.displayleftAndright();
                                break;
                            case R.id.edit_num:
                                keyboardUtil.displayleftAndrightNum(num);
                                break;
                        }
                    }
                }
            }
        });

必须监听activity的back键,以免软键盘弹出后按back导致activity被销毁

 @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK && keyboardUtil != null && keyboardUtil.hideKeyboard(bottomView)) {

            return false;
        }
        return super.onKeyDown(keyCode, event);
    }

接下来我们如何实现自定义软键盘

安卓本身就提供了android.inputmethodservice.KeyboardView类和Keyboard 来显示自定义软键盘, 项目中我只用到了数字键的输入接下来实现的是数字键盘

public KeyboardUtil(Activity act, Context ctx) {

		k2 = new Keyboard(ctx, R.xml.symbols);
		keyboardView = (KeyboardView) act.findViewById(R.id.keyboard_view);
		keyboardView.setKeyboard(k2);
		keyboardView.setEnabled(true);
		keyboardView.setPreviewEnabled(false);
		keyboardView.setOnKeyboardActionListener(listener);
		
	}


首先自定义一个键盘的布局XML

<?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="left"
			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="X" />
		<Key android:codes="48" android:keyLabel="0" />
		<Key android:codes="-5" android:keyIcon="@drawable/sym_keyboard_delete" />
	</Row>
</Keyboard>

界面显示后的效果如下:


有些身份证后面数字带有"x",键盘中自带"x",省略掉键盘的切换

输入数量时的键盘的界面显示


项目中输入数量都是一个整数,点击数字这样就可以直接方便的修改数量


当然也可以实现其它样式的软键盘,实现的原理都是一样的,根据自自己的项目需求来自定义键盘。

关键实现软键盘的类在这里不做过多的描述直接下载源码。

源码下载地址:https://github.com/MikeJon/Keyboard


  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值