需求大致就是這樣的:用戶點擊按鈕彈出Dialog,Dialog中有輸入框,然后Dialog彈出后要自動彈出軟鍵盤;(如果讓用戶自己手動點擊輸入框再彈出軟鍵盤的話,用戶體驗太差了);
好的,需求大致就是這樣;很簡單嘛Dialog.show();后手動打開軟鍵盤就可以了嘛;
第一次嘗試,代碼是這樣的:
InputPwdDialog inputPwdDialog = new InputPwdDialog(context, Gravity.CENTER,R.layout.item_dialog2); inputPwdDialog.show(); InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); // 如果軟鍵盤在窗口上已經顯示,則隱藏,反之則顯示 inputMethodManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
好神奇,軟鍵盤竟然沒有彈出來;
重新嘗試:沒關系,這次使用強制打開軟鍵盤的方法;
InputPwdDialog inputPwdDialog = new InputPwdDialog(context, Gravity.CENTER,R.layout.item_dialog2); inputPwdDialog.show(); InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); // 強制顯示軟鍵盤,view為當前的輸入框對象 inputMethodManager.showSoftInput(inputPwdDialog.findViewById(R.id.v),InputMethodManager.SHOW_FORCED);
showSoftInput();第一個參數是當前輸入框的對象;但是!!!在Dialog中無效;還是沒有軟鍵盤彈出;
嗯,不要氣餒,仔細想一想感覺軟鍵盤可能也是一種Dialog,兩個Dialog同時彈出會不會有什么沖突;
第三次重新嘗試:在Dialog顯示完成之后再去彈出軟鍵盤;
InputPwdDialog inputPwdDialog = new InputPwdDialog(context,Gravity.BOTTOM,R.layout.item_dialog); inputPwdDialog.show(); inputPwdDialog.setOnShowListener(new DialogInterface.OnShowListener() { @Override public void onShow(DialogInterface dialogInterface) { InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); inputMethodManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); } });
呵呵噠,軟鍵盤還是沒有自動彈出;
那這樣呢,第四次重新嘗試!
InputPwdDialog inputPwdDialog = new InputPwdDialog(context,Gravity.BOTTOM,R.layout.item_dialog); inputPwdDialog.show(); new Thread(new Runnable() { @Override public void run() { SystemClock.sleep(300); runOnUiThread(new Runnable() { @Override public void run() { InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); inputMethodManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); } }); } }).start();
開啟一個子線程睡眠300ms(我Dialog有個動畫200ms),然后在主線程中彈出軟鍵盤;這次軟鍵盤彈出來了,真的在Dialog彈出后自動彈出來了;
欣喜之余總感覺用這種開啟線程延遲彈出不太好;
好的,我要放大招了!!!
<!--帶輸入框--> <style name="inputDialog" parent="@android:style/Theme.Holo.Light.Dialog"> <item name="android:windowFrame">@android:color/transparent</item><!-- 邊框 --> <item name="android:windowIsFloating">true</item><!-- 是否浮現在activity之上 --> <item name="android:windowIsTranslucent">false</item><!-- 半透明 --> <item name="android:windowNoTitle">true</item><!-- 無標題 --> <item name="android:windowBackground">@android:color/transparent</item><!-- 自己想要的背景 --> <item name="android:backgroundDimEnabled">true</item><!-- 模糊 --> <item name="android:windowSoftInputMode">stateAlwaysVisible</item><!--顯示軟件盤--> </style>
給你的Dialog自定義個樣式就OK了。
網上有說使用Handler彈出軟鍵盤的;
示例代碼:
private final int BOND = 1; private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what){ case BOND: InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); inputMethodManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); break; } } };
InputPwdDialog inputPwdDialog = new InputPwdDialog(context,Gravity.BOTTOM,R.layout.item_dialog); inputPwdDialog.show(); handler.sendEmptyMessageDelayed(BOND,100);也可以使用,Dialog就是使用Handler來控制隱藏和顯示的;但是!!!不加延遲發送消息時,偶爾會出現自動彈出后又自動隱藏了。加上延遲發送消息后,第一次總是不自動彈出;
總結一下:
延遲彈出軟鍵盤和自定義Dialog樣式都可以彈出軟鍵盤;那種更好自己試試就知道了;