Android Dialog中軟鍵盤的顯示與隱藏的示例
1.寫在前面
本篇的主要內(nèi)容是關(guān)于在Dialog中軟鍵盤的顯示與隱藏問題,需求是在Dialog中有一個密碼輸入框,彈出Dialog顯示軟鍵盤,關(guān)閉Dialog隱藏軟鍵盤。
嗯,是不是有點簡單,不過在實現(xiàn)的過程中還是遇到了一些問題,在試過了網(wǎng)上大部分的方法之后,最終找到了一個還不錯的方法,分享給大家。
看下效果圖:

2.實現(xiàn)過程
先說說最開始的實現(xiàn)方法:
// 顯示Dialog dialog.show(); // 顯示軟鍵盤 SoftInputUtils.showSoftInput(activity);
But,軟鍵盤并沒有顯示,顯示軟鍵盤有兩種方法,使用的是第一種方法,第二種方法在Dialog中沒有效果。
// 第一種,如果軟鍵盤在窗口上已經(jīng)顯示,則隱藏,反之則顯示 InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE); inputMethodManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); // 第二種,強制顯示軟鍵盤,view為當(dāng)前的輸入框?qū)ο? inputMethodManager.showSoftInput(view,InputMethodManager.SHOW_FORCED);
于是查看Dialog的源碼,發(fā)現(xiàn)Dialog的顯示和隱藏是通過Handler來處理的,會不會是顯示軟鍵盤的方法執(zhí)行的太快了,于是在show方法后延時顯示軟鍵盤,發(fā)現(xiàn)是可以正常顯示的。
但是延時處理這種方法顯然不太好,有沒有一種Dialog顯示完成后就能回調(diào)的方法呢,嗯,有的,setOnShowListener方法,在OnShowListener接口的回調(diào)方法onShow中顯示軟鍵盤就可以了。軟鍵盤的隱藏并沒有這些限制,在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;
}
}
}
延時顯示軟鍵盤
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提示框是否正在運行
*
* @return Dialog提示框是否正在運行
*/
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);
// 點擊彈窗外區(qū)域,彈窗不消失
dialog.setCanceledOnTouchOutside(false);
}
/**
* 顯示確認安全碼提示框
*
* @param activity 當(dāng)前Activity
* @param dialogOnClickListener 確定按鈕點擊事件
*/
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) {
// 獲取焦點
gpvCode.requestFocus();
// 顯示軟鍵盤
SoftInputUtils.showSoftInput(activity);
}
});
dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
// 隱藏軟鍵盤
SoftInputUtils.hideSoftInput(activity);
}
});
dialog.show();
}
public interface DialogOnClickListener {
/**
* 點擊事件
*
* @param str 回調(diào)參數(shù)
*/
public void onClick(String str);
}
}
顯示和隱藏軟鍵盤的方法
public class SoftInputUtils {
/**
* 顯示軟鍵盤,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);
}
/**
* 隱藏軟鍵盤
*
* @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.寫在最后
在頻繁的顯示、關(guān)閉Dialog的測試中發(fā)現(xiàn),有時軟鍵盤不會顯示,但是沒有找到規(guī)律,有了解的同學(xué)可以給我留言評論。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android開發(fā)實現(xiàn)ListView點擊展開收起效果示例
這篇文章主要介紹了Android開發(fā)實現(xiàn)ListView點擊展開收起效果,結(jié)合實例形式分析了Android ListView控件的布局及事件響應(yīng)相關(guān)操作技巧,需要的朋友可以參考下2019-03-03
Android通過json向MySQL中讀寫數(shù)據(jù)的方法詳解【寫入篇】
這篇文章主要介紹了Android通過json向MySQL中讀寫數(shù)據(jù)的方法,結(jié)合實例形式較為詳細的分析了Android json類的定義、調(diào)用及php接收json數(shù)據(jù)并寫入mysql的實現(xiàn)技巧,需要的朋友可以參考下2016-06-06
Android應(yīng)用開發(fā)中使用GridView網(wǎng)格布局的代碼示例
GridView布局比較基礎(chǔ),可以取代已經(jīng)逐漸淡出人們視線的TableLayout,這里我們就來看一下Android應(yīng)用開發(fā)中使用GridView網(wǎng)格布局的代碼示例:2016-06-06
android網(wǎng)絡(luò)編程之a(chǎn)ndroid連接網(wǎng)絡(luò)的簡單示例代碼
這篇文章主要介紹了android連接網(wǎng)絡(luò)的簡單示例,需要的朋友可以參考下2014-04-04
Android編程開發(fā)之在Canvas中利用Path繪制基本圖形(圓形,矩形,橢圓,三角形等)
這篇文章主要介紹了Android編程開發(fā)之在Canvas中利用Path繪制基本圖形的方法,涉及Android基本的圖形繪制技巧,結(jié)合實例分析了繪制圓形,矩形,橢圓,三角形等基本圖形的實現(xiàn)方法,需要的朋友可以參考下2016-01-01
Android UI設(shè)計與開發(fā)之實現(xiàn)應(yīng)用程序只啟動一次引導(dǎo)界面
這篇文章主要為大家詳細介紹了Android UI設(shè)計與開發(fā)之實現(xiàn)應(yīng)用程序只啟動一次引導(dǎo)界面,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-08-08

