Android Dialog中软键盘的显示与隐藏的示例

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下载

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android自定义dialog可选择展示年月日时间选择栏

    自定义dialog package com.poptest; import android.app.DatePickerDialog; import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.DatePicker; //dialog类 public class YearPickerDialog extends DatePickerD

  • Android 常用log 关键字

    记录下常用的log关键字 1.windowmanager接收到全局按键 WindowManager: interceptKeyTq keycode=26 interactive=false keyguardActive=true policyFlags=2000000 WindowManager: interceptKeyTq keycode=26 interactive=false keyguardActive=true policyFlags=2000000 down =true // 按下

  • Android实现底部对话框BottomDialog弹出实例代码

    最近项目上需要实现一个底部对话框,要实现这样的功能其实很简单,先看代码: private void show1() { Dialog bottomDialog = new Dialog(this, R.style.BottomDialog); View contentView = LayoutInflater.from(this).inflate(R.layout.dialog_content_normal, null); bottomDialog.setContentView(contentV

  • Android 自定义AlertDialog对话框样式

    实际的项目开发当中,经常需要根据实际的需求来自定义AlertDialog.最近在开发一个WIFI连接的功能,点击WIFI需要弹出自定义密码输入框.在此权当记录 效果图 点击首页的Button即跳出对话框,显示WIFI信息(TextView),密码输入框(EditText),取消和连接按钮(Button) 实现 根据自己实际的需求,为AlertDialog创建一个布局,在此我需要定义一个如图所示的WIFI密码输入框,故在 res/layout 目录下建立一个 dialog_layout.xml 文

  • Android实现自定义圆角对话框Dialog的示例代码

    前言: 项目中多处用到对话框,用系统对话框太难看,就自己写一个自定义对话框. 对话框包括:1.圆角 2.app图标 , 提示文本,关闭对话框的"确定"按钮 难点:1.对话框边框圆角显示 2.考虑到提示文本字数不确定,在不影响美观的情况下,需要在一行内显示提示的文字信息 3.设置对话框的宽和高 技术储备: 1.安卓开发_使用AlertDialog实现对话框    知道AlertDialog有setView(view) ,Dialog 有ContentView(view) 方法. 2.An

  • Android中ProgressDialog的dismiss()与cancel()方法的区别

    progressDialog, 它有两个方法dialog.cancel() 和 dialog.dimiss() 1. public void cancel () Since: API Level 1 Cancel the dialog. This is essentially the same as calling dismiss(), but it will also call your DialogInterface.OnCancelListener (if registered). 2.p

  • Android仿IOS自定义AlertDialog提示框

    本文介绍的仿IOS对话框的实现,先来看一下效果图 具体代码如下: public class AlertDialog { private Context context; private Dialog dialog; private LinearLayout lLayout_bg; private TextView txt_title; private TextView txt_msg; private Button btn_neg; private Button btn_pos; private

  • Android仿支付宝微信支付密码界面弹窗封装dialog

    一,功能效果 二,实现过程 1,先写xml文件:dialog_keyboard.xml 注意事项 (1),密码部分用的是一个线性布局中6个TextView,并设置android:inputType="numberPassword",外框是用的一个有stroke属性的shape, (2),1-9数字是用的recycleview ,每个item的底部和右边有1dp的黑线,填充后形成分割线. (3),recycleview 要设置属性  android:overScrollMode=&quo

  • Android Dialog中软键盘的显示与隐藏的示例

    1.写在前面 本篇的主要内容是关于在Dialog中软键盘的显示与隐藏问题,需求是在Dialog中有一个密码输入框,弹出Dialog显示软键盘,关闭Dialog隐藏软键盘. 嗯,是不是有点简单,不过在实现的过程中还是遇到了一些问题,在试过了网上大部分的方法之后,最终找到了一个还不错的方法,分享给大家. 看下效果图: 2.实现过程 先说说最开始的实现方法: // 显示Dialog dialog.show(); // 显示软键盘 SoftInputUtils.showSoftInput(activit

  • Android开发中软键盘的显示和隐藏

    本篇内容通过操作软键盘的函数着手详细分析了隐藏或者显示软键盘的实现方法,并且对其中重要的代码做了详细分析. 一.开篇 如果有需要用到输入的地方,通常会有需要自动弹出或者收起软键盘的需求.开篇明义,本文会讲讲弹出和收起软键盘的一些细节,最终还会从源码进行分析. 想要操作软键盘,需要使用到 InputMethodManager ,它是一个系统服务,可以使用 Context.getSystemService() 获取到它.而很多关键的逻辑代码,都是在 InputMethodManagerService

  • Android编程中软键盘基本用法分析

    本文实例讲述了Android编程中软键盘基本用法.分享给大家供大家参考,具体如下: 调用下面代码:(第一次调用显示,再次调用则隐藏,如此反复),this指activity InputMethodManager imm = (InputMethodManager)this.getSystemService(Context.INPUT_METHOD_SERVICE); imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); imm.sh

  • Android监听软键盘弹出与隐藏的两种方法

    需求: 现在有一个需求是点击一行文本框,弹出一个之前隐藏的输入框,输入完成后按返回键或者其他的东西隐藏键盘和输入框,将输入框的内容填充到文本框中. 实现: 拿到这个需求的第一反应就是写一个监听来监听键盘的显示和隐藏来控制输入框的显示和隐藏,控制文本框中的内容. 所以我做了如下操作: 指定android:windowSoftInputMode="adjustResize|stateAlwaysHidden"这个的做法是为了让键盘弹出时改变布局. 让Activity实现Layoutchan

  • Android开发之软键盘用法实例分析

    本文实例讲述了Android开发中软键盘用法.分享给大家供大家参考.具体如下: 打开软键盘,有两个方法.一个是showSoftInput,一个是toggleSoftInput. package com.example.dd; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.view.Menu; import android.view.View

  • Android 监听软键盘状态的实例详解

    Android 监听软键盘状态的实例详解 近日遇到要检测软键盘是否显示或隐藏的问题,搜了一下网上,最后找到一个很简单的,记录一下. activityRoot是activity的根view,就是xml里面的第一个view,给它设置一个id. final View activityRootView = findViewById(R.id.activityRoot); activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(ne

  • Android软键盘的显示隐藏功能实现过程

    一.软键盘显示的原理 软件盘的本质是什么?软键盘其实是一个Dialog! InputMethodService为我们的输入法创建了一个Dialog,并且将该Dialog的Window的某些参数(如Gravity)进行了设置,使之能够在底部或者全屏显示.当我们点击输入框时,系统对活动主窗口进行调整,从而为输入法腾出相应的空间,然后将该Dialog显示在底部,或者全屏显示. 二.活动主窗口调整 android定义了一个属性,名字为windowSoftInputMode, 用它可以让程序可以控制活动主

  • Android编程之软键盘的隐藏显示实例详解

    本文实例分析了Android编程之软键盘的隐藏显示方法.分享给大家供大家参考,具体如下: Android是一个针对触摸屏专门设计的操作系统,当点击编辑框,系统自动为用户弹出软键盘,以便用户进行输入. 那么,弹出软键盘后必然会造成原有布局高度的减少,那么系统应该如何来处理布局的减少?我们能否在应用程序中进行自定义的控制?这些是本文要讨论的重点. 一.软键盘显示的原理 软件盘的本质是什么?软键盘其实是一个Dialog! InputMethodService为我们的输入法创建了一个Dialog,并且将

  • Android屏蔽软键盘并且显示光标的实例详解

    Android屏蔽软键盘并且显示光标的实例详解 如果是android4.0以下,那么 editText.setInputType(InputType.TYPE_NULL); 就够了,android4.0以上屏蔽软键盘并且有光标,需要用到. if (android.os.Build.VERSION.SDK_INT <= 10) {//4.0以下 danielinbiti editText.setInputType(InputType.TYPE_NULL); } else { this.act.ge

  • Android 弹出软键盘所遇到的坑及解决方法

    demo下载 重要代码: //1.此layout作为最外层的layout: //2.设置需要调整的view: setAdjustView(View view); //3.如果需要控制输入框的显示与隐藏,可以实现OnInputViewVisibleListener接口: public class SoftInputAdjustLayout extends RelativeLayout { private static final String TAG = SoftInputAdjustLayout

随机推荐