Android 顯示Dialog的同時自動彈出軟鍵盤;


需求大致就是這樣的:用戶點擊按鈕彈出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樣式都可以彈出軟鍵盤;那種更好自己試試就知道了;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM