大致了解android里自定义键盘的实现方法有:popupWindow弹出框、android.inputmethodservice.KeyboardView 系统api、 用Framelayout和RelativeLayout来做叠加层动态显示隐藏。最开始以为光标不显示的问题和自定义键盘的实现方式有关,以为是不在一个层当焦点落在上一个层的时候,下面的EditText自然没有焦点所以才没光标显示。后来验证后发现跟层无关,而影响光标是否显示的关键操作是隐藏系统软键盘所使用的方式。
点击EditText时要隐藏系统软键盘了解的方法有:
InputMethodManager inputManager = (InputMethodManager)context .getSystemService(Context.INPUT_METHOD_SERVICE); inputManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
edit.setInputType(InputType.TYPE_NULL); edit.setInputType(InputType.TYPE_DATETIME_VARIATION_NORMAL);
edit.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return true; } });
第一种方法主要用于软键盘已经弹出之后来隐藏键盘,后面两种方法感觉则是在改变输入框的属性和中断事件传递来阻止系统弹出软键盘。当我们要使用自定义软键盘的时候,肯定是使用后两种来隐藏系统键盘。而后两种单独使用的话,光标均不可见,且后一种EditText不能获取默认焦点。查找之后用如下方式可以实现光标显示:
testEdit.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if(event.getAction()==MotionEvent.ACTION_UP){ int type=testEdit.getInputType(); testEdit.setInputType(InputType.TYPE_NULL); if(popWindow.isShowing()){ popWindow.dismiss(); }else{ popWindow.showAsDropDown(testEdit); } testEdit.setInputType(type); } return false; } });
现在还不清楚具体的原理,但感觉跟系统显示系统软键盘和光标的机制有关,可以有时间看看系统调度软键盘和显示光标的方式来解答。