Android Dialog中軟鍵盤(pán)的顯示與隱藏的示例
1.寫(xiě)在前面
本篇的主要內(nèi)容是關(guān)于在Dialog中軟鍵盤(pán)的顯示與隱藏問(wèn)題,需求是在Dialog中有一個(gè)密碼輸入框,彈出Dialog顯示軟鍵盤(pán),關(guān)閉Dialog隱藏軟鍵盤(pán)。
嗯,是不是有點(diǎn)簡(jiǎn)單,不過(guò)在實(shí)現(xiàn)的過(guò)程中還是遇到了一些問(wèn)題,在試過(guò)了網(wǎng)上大部分的方法之后,最終找到了一個(gè)還不錯(cuò)的方法,分享給大家。
看下效果圖:
2.實(shí)現(xiàn)過(guò)程
先說(shuō)說(shuō)最開(kāi)始的實(shí)現(xiàn)方法:
// 顯示Dialog dialog.show(); // 顯示軟鍵盤(pán) SoftInputUtils.showSoftInput(activity);
But,軟鍵盤(pán)并沒(méi)有顯示,顯示軟鍵盤(pán)有兩種方法,使用的是第一種方法,第二種方法在Dialog中沒(méi)有效果。
// 第一種,如果軟鍵盤(pán)在窗口上已經(jīng)顯示,則隱藏,反之則顯示 InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE); inputMethodManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); // 第二種,強(qiáng)制顯示軟鍵盤(pán),view為當(dāng)前的輸入框?qū)ο? inputMethodManager.showSoftInput(view,InputMethodManager.SHOW_FORCED);
于是查看Dialog的源碼,發(fā)現(xiàn)Dialog的顯示和隱藏是通過(guò)Handler來(lái)處理的,會(huì)不會(huì)是顯示軟鍵盤(pán)的方法執(zhí)行的太快了,于是在show方法后延時(shí)顯示軟鍵盤(pán),發(fā)現(xiàn)是可以正常顯示的。
但是延時(shí)處理這種方法顯然不太好,有沒(méi)有一種Dialog顯示完成后就能回調(diào)的方法呢,嗯,有的,setOnShowListener方法,在OnShowListener接口的回調(diào)方法onShow中顯示軟鍵盤(pán)就可以了。軟鍵盤(pán)的隱藏并沒(méi)有這些限制,在dismiss之后隱藏,或者在回調(diào)方法onDismiss中隱藏都可以。
/** * 發(fā)送顯示Dialog的消息 */ private void sendShowMessage() { if (mShowMessage != null) { // Obtain a new message so this dialog can be re-used Message.obtain(mShowMessage).sendToTarget(); } } /** * 接收顯示或隱藏Dialog的消息 */ private static final class ListenersHandler extends Handler { private WeakReference<DialogInterface> mDialog; public ListenersHandler(Dialog dialog) { mDialog = new WeakReference<DialogInterface>(dialog); } @Override public void handleMessage(Message msg) { switch (msg.what) { case DISMISS: ((OnDismissListener) msg.obj).onDismiss(mDialog.get()); break; case CANCEL: ((OnCancelListener) msg.obj).onCancel(mDialog.get()); break; case SHOW: ((OnShowListener) msg.obj).onShow(mDialog.get()); break; } } }
延時(shí)顯示軟鍵盤(pán)
new Thread() { @Override public void run() { super.run(); activity.runOnUiThread(new Runnable() { @Override public void run() { SoftInputUtils.showSoftInput(activity); } }); } }.start();
3.代碼
顯示Dialog提示框
public class DialogUtils { private static Dialog dialog; /** * Dialog提示框消失方法 */ public static void dialogDismiss() { if (isDialogShowing()) { dialog.dismiss(); dialog = null; } } /** * Dialog提示框是否正在運(yùn)行 * * @return Dialog提示框是否正在運(yùn)行 */ public static boolean isDialogShowing() { return dialog != null && dialog.isShowing(); } /** * 創(chuàng)建Dialog提示框 * * @param context 上下文 */ private static void createDialog(Context context) { dialogDismiss(); dialog = new Dialog(context, R.style.SampleTheme); dialog.setContentView(R.layout.layout_dialog); // 點(diǎn)擊彈窗外區(qū)域,彈窗不消失 dialog.setCanceledOnTouchOutside(false); } /** * 顯示確認(rèn)安全碼提示框 * * @param activity 當(dāng)前Activity * @param dialogOnClickListener 確定按鈕點(diǎn)擊事件 */ public static void showSecurityCodeInputDialog(final Activity activity, final DialogOnClickListener dialogOnClickListener) { createDialog(activity); ImageView ivClose = (ImageView) dialog.findViewById(R.id.iv_close); final GridPasswordView gpvCode = (GridPasswordView) dialog.findViewById(R.id.gpv_code); Button btnOk = (Button) dialog.findViewById(R.id.btn_ok); ivClose.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dialogDismiss(); } }); btnOk.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String code = gpvCode.getPassWord(); dialogOnClickListener.onClick(code); } }); dialog.setOnShowListener(new DialogInterface.OnShowListener() { @Override public void onShow(DialogInterface dialog) { // 獲取焦點(diǎn) gpvCode.requestFocus(); // 顯示軟鍵盤(pán) SoftInputUtils.showSoftInput(activity); } }); dialog.setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { // 隱藏軟鍵盤(pán) SoftInputUtils.hideSoftInput(activity); } }); dialog.show(); } public interface DialogOnClickListener { /** * 點(diǎn)擊事件 * * @param str 回調(diào)參數(shù) */ public void onClick(String str); } }
顯示和隱藏軟鍵盤(pán)的方法
public class SoftInputUtils { /** * 顯示軟鍵盤(pán),Dialog使用 * * @param activity 當(dāng)前Activity */ public static void showSoftInput(Activity activity) { InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE); inputMethodManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); } /** * 隱藏軟鍵盤(pán) * * @param activity 當(dāng)前Activity */ public static void hideSoftInput(Activity activity) { InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow( activity.getWindow().getDecorView().getWindowToken(), 0); } }
調(diào)用顯示Dialog的方法
DialogUtils.showSecurityCodeInputDialog(this, new DialogUtils.DialogOnClickListener() { @Override public void onClick(String str) { Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show(); DialogUtils.dialogDismiss(); } });
4.寫(xiě)在最后
在頻繁的顯示、關(guān)閉Dialog的測(cè)試中發(fā)現(xiàn),有時(shí)軟鍵盤(pán)不會(huì)顯示,但是沒(méi)有找到規(guī)律,有了解的同學(xué)可以給我留言評(píng)論。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android中NestedScrolling滑動(dòng)機(jī)制詳解
本篇文章主要介紹了Android中NestedScrolling滑動(dòng)機(jī)制詳解,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-02-02Android中斷并重啟一個(gè)Thread線程的簡(jiǎn)單方法
下面小編就為大家?guī)?lái)一篇Android中斷并重啟一個(gè)Thread線程的簡(jiǎn)單方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02Android中SparseArray性能優(yōu)化的使用方法
這篇文章主要為大家詳細(xì)介紹了Android中SparseArray性能優(yōu)化的使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-04-04Android Menu半透明效果的開(kāi)發(fā)實(shí)例
這篇文章主要介紹了Android Menu半透明效果方法的相關(guān)資料,需要的朋友可以參考下2016-09-09Android仿微信對(duì)話列表滑動(dòng)刪除效果
這篇文章主要為大家詳細(xì)介紹了Android仿微信對(duì)話列表滑動(dòng)刪除效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08Android開(kāi)發(fā) -- UI界面之threme和style
做Java的人一般都做過(guò)CSS,我們都知道它也有一個(gè)樣式,Android中的樣式也可以進(jìn)行類(lèi)比。2016-06-06Android開(kāi)發(fā)Jetpack組件DataBinding用例詳解
這篇文章主要為大家介紹了Android開(kāi)發(fā)Jetpack組件DataBinding的使案用例詳解說(shuō)明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02Android數(shù)字選擇器NumberPicker使用詳解
這篇文章主要為大家詳細(xì)介紹了Android數(shù)字選擇器NumberPicker的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08android中打開(kāi)相機(jī)、打開(kāi)相冊(cè)進(jìn)行圖片的獲取示例
本篇文章主要介紹了android中打開(kāi)相機(jī)、打開(kāi)相冊(cè)進(jìn)行圖片的獲取示例,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2017-01-01