1. 程式人生 > >Android學習問題:關於AlertDialog中自定義佈局帶有的EditText無法彈出鍵盤

Android學習問題:關於AlertDialog中自定義佈局帶有的EditText無法彈出鍵盤

最近在用到AlertDialog的時候,自定義了其佈局檔案,其中帶有EditText,但是發現在手機上使用的時候,點選EditText卻沒有彈出鍵盤,在網上搜索了下,看到有好幾種解決方法,試過其中一些方法,有些有效果,有些卻是沒有效果,在這裡小小總結下;

1.第一種是在AndroidManifest.xml中,把此Activity的屬性,加個android:windowSoftInputMode=”stateVisible|adjustResize”。

這個方法有試過,但是效果是一進入這個Activity就彈出鍵盤,而在彈出我所需要的dialog時,點選EditText是依然沒有彈出鍵盤的;

2.加入下面這段程式碼,這是我最終採取的一個解決方法:

alertDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);

3.另外,對於是自定義了AlertDialog 的,還有一種解決方法是繼承Dialog類,而不是AlertDialog,不過由於我只是自定義佈局,並不是自定義AlertDialog控制元件,所以這個方法並沒有親自試過.

如果是自定義Dialog的,還有一個參考方法如下:
參考自 android中自定義的dialog中的EditText無法彈出輸入法解決方案


1.解決無法彈出輸入法:
在show()方法呼叫之前,用dialog.setView(new EditText(context))新增一個空的EditText,由於是自定義的AlertDialog,有我們指定的佈局,所以設定這個不會影響我們的功能,這樣就可以彈出輸入法了……
2.可以彈出輸入法了,但了為了增強使用者體驗性,當dialog中含有editText時應該,在顯示dialog的同時自動彈出鍵盤:
(1) 可以在自定義的dialog中增加如下方法:

public void showKeyboard() {  
        if(editText!=null){  
            //設定可獲得焦點  
editText.setFocusable(true); editText.setFocusableInTouchMode(true); //請求獲得焦點 editText.requestFocus(); //呼叫系統輸入法 InputMethodManager inputManager = (InputMethodManager) editText .getContext().getSystemService(Context.INPUT_METHOD_SERVICE); inputManager.showSoftInput(editText, 0); } }

其中editText為自定義dialog中的輸入框的view
(2) 在dialog.show()後,呼叫這個方法顯示輸入法,由於在呼叫時可能dialog介面還未載入完成,editText 可能還為空,所以需要加上一個延時任務,延遲顯示:

dialog.show();  
Timer timer = new Timer();  
timer.schedule(new TimerTask() {  

    @Override  
    public void run() {  
        dialog.showKeyboard();  
    }  
}, 200);  

在這篇Android開發 解決AlertDialog中的EditText無法調出輸入法的問題中,也給出了兩個解決方法:
在AlertDialog中使用自定義的View,如果View中有EditText,在上面點選,預設是跳不出軟鍵盤的,不是焦點的問題。
解決方法,有兩種,一是把AlertDialog換成Dialog,但這麼一來,對話方塊的最外層會多出一個框,頂部還會空幾十個DP,當然可以用setBackgroundDrawable(new ColorDrawable(0))把背景設為透明,隱藏掉邊框,但是上面空著的幾十個DP還在,對話方塊就不是在螢幕居中了。
程式碼:

Dialog ad = new Dialog(context);
ad.show();
Window window = ad.getWindow();
window.setBackgroundDrawable(new ColorDrawable(0));  
window.setContentView(R.layout.cancel_sos_dialog);

其解決方法是採用自定義的style:

 <style name="CustomDialogStyle" parent="@android:style/Theme.Dialog">
        <item name="android:windowFrame">@null</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:background">@android:color/transparent</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:backgroundDimEnabled">true</item>
        <item name="android:backgroundDimAmount">0.6</item>
    </style>
Dialog ad = new Dialog(context,R.style.CustomDialogStyle);

最好的辦法是第二種:

AlertDialog ad =  new AlertDialog.Builder(context).create(); 
ad.setView(ManagerDialogLayout_.build(context,ad));
ad.show();
Window window = ad.getWindow();
window.setContentView(ManagerDialogLayout_.build(context,ad));

在呼叫show方法前先呼叫setView(layout),show後再呼叫window.setContentView(layout),兩個Layout佈局應該是相同的。

至於原因,暫時不明,有待解決。