Dialog的軟鍵盤顯示和隱藏問題

AlertDialog中軟鍵盤顯示問題

使用AlertDialog來自定義一個(gè)包含EditText的Dialog,你會(huì)發(fā)現(xiàn)使用的過程中軟鍵盤不會(huì)自動(dòng)顯示出來,這個(gè)問題我覺得跟google對(duì)AlertDialog的定義有關(guān),AlertDialog本身只是一個(gè)警示提示框,不需要編輯,只用來提示客戶,客戶需要做的操作只是取消和確定。
所以這個(gè)問題的本身跟控件的定義有關(guān),雖然網(wǎng)絡(luò)上有各種解決的方法,我的建議還是把AlertDialog改成Dialog,問題自然就解決了。

Dialog中軟件盤隱藏問題

在Dialog中彈出軟件盤后,你會(huì)發(fā)現(xiàn)軟鍵盤的隱藏存在各種問題,你需要自定義一個(gè)Dialog,并在自定義的Dialog中實(shí)現(xiàn)以下代碼

public class MyDialog extends Dialog {
    public MyDialog(@NonNull Context context) {
        super(context);
    }

    public MyDialog(@NonNull Context context, int themeResId) {
        super(context, themeResId);
    }

    protected MyDialog(@NonNull Context context, boolean cancelable, @Nullable OnCancelListener cancelListener) {
        super(context, cancelable, cancelListener);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
            View v = getCurrentFocus();
            if (isShouldHideKeyboard(v, ev)) {
                hideKeyboard(v.getWindowToken());
            }
        }
        return super.dispatchTouchEvent(ev);
    }

    /**
     * 根據(jù)EditText所在坐標(biāo)和用戶點(diǎn)擊的坐標(biāo)相對(duì)比,來判斷是否隱藏鍵盤,因?yàn)楫?dāng)用戶點(diǎn)擊EditText時(shí)則不能隱藏
     *
     * @param v
     * @param event
     * @return
     */
    private boolean isShouldHideKeyboard(View v, MotionEvent event) {
        if (v != null && (v instanceof EditText)) {
            int[] l = {0, 0};
            v.getLocationInWindow(l);
            int left = l[0],
                    top = l[1],
                    bottom = top + v.getHeight(),
                    right = left + v.getWidth();
            if (event.getX() > left && event.getX() < right
                    && event.getY() > top && event.getY() < bottom) {
                // 點(diǎn)擊EditText的事件,忽略它。
                return false;
            } else {
                return true;
            }
        }
        // 如果焦點(diǎn)不是EditText則忽略,這個(gè)發(fā)生在視圖剛繪制完,第一個(gè)焦點(diǎn)不在EditText上,和用戶用軌跡球選擇其他的焦點(diǎn)
        return false;
    }

    private void hideKeyboard(IBinder token) {
        if (token != null) {
            InputMethodManager im = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
            im.hideSoftInputFromWindow(token, InputMethodManager.HIDE_NOT_ALWAYS);
        }
    }
}

這時(shí)候你會(huì)發(fā)現(xiàn)問題解決了。。。如果還沒有解決,請(qǐng)?jiān)诹粞愿嬖V我。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,034評(píng)論 25 709
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程,因...
    小菜c閱讀 7,329評(píng)論 0 17
  • 最近正在研究個(gè)性化推薦相關(guān)的知識(shí),本文以電商平臺(tái)為例,逐步探討有關(guān)個(gè)性化推薦的知識(shí)。 研究一個(gè)事物,首先要了解這個(gè)...
    勵(lì)秣閱讀 2,437評(píng)論 2 46
  • 每當(dāng)想起父親,內(nèi)心就會(huì)感受到厚重與踏實(shí),有種背靠大山的安穩(wěn)感覺,原本躁動(dòng)的心便立刻平靜下來。 1.父親的嚴(yán)肅 記憶...
    哈佛媽媽親子園閱讀 603評(píng)論 7 10
  • 如果再給一次機(jī)會(huì)…… 我想把我的腦子重新洗過 不要懂那么多 知道那么多 因?yàn)檫@才是最累的…… 有時(shí)候 人還是傻傻的...
    wuli雨閱讀 354評(píng)論 0 0

友情鏈接更多精彩內(nèi)容