一、问题:
Dialog中有输入框时,显示后无法自动弹起软键盘,原因就不赘述了,自行Google。
一、解决办法:
开启独立线程,线程中使用while
循环,循环调用弹起软键盘方法,直至showSoftInput
返回true
,则终止循环。循环内加入sleep
,避免调用次数过多。亲测循环不超过5
次,即可成功开启软键盘,效果流畅丝滑。
注意:不要用toggleSoftInput
相关方法,那样会使得你的软键盘管理混乱!
public class KeyboardManager {
private final String TAG = "KeyboardManager";
private static volatile KeyboardManager mKeyboardManager;
private InputMethodManager mInputMethodManager;
public static synchronized KeyboardManager with() {
if (mKeyboardManager == null) {
synchronized (KeyboardManager.class) {
if (mKeyboardManager == null) {
mKeyboardManager = new KeyboardManager();
}
}
}
return mKeyboardManager;
}
private KeyboardManager() {
}
public InputMethodManager getInputMethodManager() {
if (null == mInputMethodManager)
mInputMethodManager = (InputMethodManager) ApplicationExt.getInstance().getSystemService(Context.INPUT_METHOD_SERVICE);
return mInputMethodManager;
}
public void show(View mView) {
if (getInputMethodManager() == null || null == mView) {
return;
}
mView.requestFocus();
getInputMethodManager().showSoftInput(mView, 0);
}
Thread mThread;
public void showDelayed(View mView) {
if (getInputMethodManager() == null || null == mView) {
return;
}
mView.requestFocus();
mThread = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
if (mView.isShown() && mView.isFocused()) {
boolean isShow = getInputMethodManager().showSoftInput(mView, 0);
Log.i(TAG, "keyboard is show " + isShow);
if (isShow)
break;
else {
try {
Thread.sleep(20);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
Log.i(TAG, "continue show keyboard");
}
}
});
mThread.start();
}
public void hide(View mView) {
if (getInputMethodManager() == null || null == mView) {
return;
}
mView.clearFocus();
getInputMethodManager().hideSoftInputFromWindow(mView.getWindowToken(), 0);
}
}