本文主要记录,实现softkeyboard跟随一个含EditText的Popupwindow的显示而显示,隐藏而隐藏,的过程中所遇到的问题;
显示:editText.setOnFocusChangeListener(new OnFocusChangeListener(){});
隐藏:popupwindow.setOnDismissListener(new OnDismissListener() {});
editText.setOnKeyListener(new ***(){dismiss()})
然而,在此过程中却发现InputMethodManager 所提供的方法无法实现上述功能,要么能显示,却无法隐藏;要么能隐藏,却无法显示。
最后,通过下面代码可解决:
void toggleSoftInput(final boolean hidden) {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
InputMethodManager im = (InputMethodManager) mContext
.getSystemService(Context.INPUT_METHOD_SERVICE);
boolean flag = false;
if(hidden){
im.hideSoftInputFromWindow(editText.getWindowToken(),
InputMethodManager.HIDE_IMPLICIT_ONLY);
}else{
flag = im.showSoftInput(editText,
InputMethodManager.SHOW_IMPLICIT);
}
Log.i(TAG, "showCommentDialog toggleSoftInput hidden: " + hidden);
Log.i(TAG, "showCommentDialog toggleSoftInput flag: " + flag);
}
}, 500);
}
另一种情况:
若Activity中的EditText,手动调用隐藏则无需延时,但要注意flag的设定:HIDE_NOT_ALWAYS
InputMethodManager im = (InputMethodManager) context
.getSystemService(Context.INPUT_METHOD_SERVICE);
im.hideSoftInputFromWindow(editText.getWindowToken(),
InputMethodManager.HIDE_NOT_ALWAYS);
当然,可能按照上述代码依旧无法实现功能,此时可尝试更改“flag”.
参考:http://www.cnblogs.com/over140/archive/2011/03/04/1970517.html
http://hubingforever.blog.163.com/blog/static/17104057920110751348743/
但android2.2的某些机型竟出现了,键盘覆盖住了Popupwindow的BUG,可通过下面方案解决:
构造Popupwindow时将:
setWidth(LayoutParams.MATCH_PARENT);
setHeight(100dp);
改为:
setWidth(LayoutParams.MATCH_PARENT);
setHeight(LayoutParams.MATCH_PARENT);
即可。
当然,可能有另外的一些原因也可导致此bug,可尝试使用
setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
但是这并非能解决我的问题