Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android Dialog中軟鍵盤的顯示與隱藏的示例

Android Dialog中軟鍵盤的顯示與隱藏的示例

日期:2016/3/15 10:55:00      編輯:關於Android編程

1.寫在前面

本篇的主要內容是關於在Dialog中軟鍵盤的顯示與隱藏問題,需求是在Dialog中有一個密碼輸入框,彈出Dialog顯示軟鍵盤,關閉Dialog隱藏軟鍵盤。

嗯,是不是有點簡單,不過在實現的過程中還是遇到了一些問題,在試過了網上大部分的方法之後,最終找到了一個還不錯的方法,分享給大家。

看下效果圖:

2.實現過程

先說說最開始的實現方法:

// 顯示Dialog
dialog.show();

// 顯示軟鍵盤
SoftInputUtils.showSoftInput(activity);

But,軟鍵盤並沒有顯示,顯示軟鍵盤有兩種方法,使用的是第一種方法,第二種方法在Dialog中沒有效果。

// 第一種,如果軟鍵盤在窗口上已經顯示,則隱藏,反之則顯示
InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);

// 第二種,強制顯示軟鍵盤,view為當前的輸入框對象
inputMethodManager.showSoftInput(view,InputMethodManager.SHOW_FORCED); 

 於是查看Dialog的源碼,發現Dialog的顯示和隱藏是通過Handler來處理的,會不會是顯示軟鍵盤的方法執行的太快了,於是在show方法後延時顯示軟鍵盤,發現是可以正常顯示的。

但是延時處理這種方法顯然不太好,有沒有一種Dialog顯示完成後就能回調的方法呢,嗯,有的,setOnShowListener方法,在OnShowListener接口的回調方法onShow中顯示軟鍵盤就可以了。軟鍵盤的隱藏並沒有這些限制,在dismiss之後隱藏,或者在回調方法onDismiss中隱藏都可以。

/**
 * 發送顯示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();
  }


  /**
   * 創建Dialog提示框
   *
   * @param context 上下文
   */
  private static void createDialog(Context context) {
    dialogDismiss();
    dialog = new Dialog(context, R.style.SampleTheme);
    dialog.setContentView(R.layout.layout_dialog);
    // 點擊彈窗外區域,彈窗不消失
    dialog.setCanceledOnTouchOutside(false);
  }

  /**
   * 顯示確認安全碼提示框
   *
   * @param activity       當前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 回調參數
     */
    public void onClick(String str);
  }
}

顯示和隱藏軟鍵盤的方法

public class SoftInputUtils {

  /**
   * 顯示軟鍵盤,Dialog使用
   *
   * @param activity 當前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 當前Activity
   */
  public static void hideSoftInput(Activity activity) {
    InputMethodManager inputMethodManager =
        (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(
        activity.getWindow().getDecorView().getWindowToken(), 0);
  }
}

調用顯示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.寫在最後

在頻繁的顯示、關閉Dialog的測試中發現,有時軟鍵盤不會顯示,但是沒有找到規律,有了解的同學可以給我留言評論。

完整的Demo下載 

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持本站。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved