Android AlertDialog 对话框开启和关闭输入法问题

AlertDialog 对话框是android jar包自带的对话框,说实话 真的很丑,黑白相间,不是很推荐使用。大多时候 特别是项目中,不建议使用,通常的方法都是自定义对话框,封装一个顶级对话框,通过继承的方式 再去实现相应优美的对话框,整体效果界面很好,且易于管理和维护。因为今天主要讨论一下对话框弹出和关闭输入法问题,这个对自定义也是通用的,所以就AlertDialog 为例。

一:基本格式

new AlertDialog.Builder(self).setTitle("请重新命名").setIcon(android.R.drawable.ic_dialog_info).setView(new EditText(self)).setPositiveButton("确定", null).setNegativeButton("取消", null).show();

这个是其中的一个格式,可以通过设置不同的item来控制不同的样式,但是大体的风格就如同上面一样。由于涉及到了 EditText 所以就有输入法弹出框。

二:输入法弹出框
当然并不是都可以顺利打开。输入法框面临两个问题。
1.输入法无法打开情况:
可以阅读官方文档:http://developer.android.com/reference/android/app/Dialog.html
其中有一段:
Note: Activities provide a facility to manage the creation, saving and restoring of dialogs. See onCreateDialog(int), onPrepareDialog(int, Dialog), showDialog(int), anddismissDialog(int). If these methods are used, getOwnerActivity() will return the Activity that managed this dialog.

Often you will want to have a Dialog display on top of the current input method, because there is no reason for it to accept text. You can do this by setting theWindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM window flag (assuming your Dialog takes input focus, as it the default) with the following code:

 getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);

这是默认情况下隐藏软键盘的方法,要重新显示软键盘,要执行下面这段代码:

alertDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);

AlertDialog.setView()则不会出现以上问题。
另外:为了防止弹出输入法时把后面的背景挤变形,可以在Manifest里添加:

Android:windowSoftInputMode="adjustPan|stateHidden"

2.输入法无法关闭的问题:
问题1网上有很多,问题2的话则很难搜到。因为很多时候我们并不是在主 Activity中处理 我们可能在一个 view Fragment 中处理时候需要注意 。

private void close hideSoftInput(){
InputMethodManager inputMethodManager = (InputMethodManager)               getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(FieldActivity.this.getCurrentFocus().getWindowToken(),  InputMethodManager.HIDE_NOT_ALWAYS);
}

当我们在 确定 或者 取消 事件后 我们希望 对话框消失的时候 ,输入法弹出框也消失,事实上 我们只需要处理输入法,不然手动关闭输入法真的很蹩脚。

FieldActivity.this.getCurrentFocus().getWindowToken()=null,当我们在事件中调用的时候,无法获取指定依附视图的令牌,程序崩溃掉了,如果能预先try catch一下也好,但是并不能关闭输入法。

正确的姿势是,传入指定视图,获取指定的令牌。 由于我们并不都是主线程中操作,涉及UI的问题,我们需要post到主线程,当然处理方式很多。比图 post到EditText的线程,context.runOnUiThread(Runable runabe) ,Handler ,asynctask等方式。

我们只需要在 确定或者取消的事件里面执行如下:

context.runOnUiThread(new Runable(){public void run(){hideSoftInput(editText);}});
private void close hideSoftInput(EditText editText){
InputMethodManager inputMethodManager = (InputMethodManager)               getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(editText.getWindowToken(),  InputMethodManager.HIDE_NOT_ALWAYS);
}

editText.getWindowToken()
这样就可以成功关闭输入法。

完毕。补充一个小地方吧。如果输入框第一次点击时候需要显示默认的参数,如果不做处理的话,EditText 的光标会在最前面 不在字儿后面。
需要在EditText初始化的时候加上;这样光标就在末尾处。

editText.setSelection(editText.getText().length());

“`

Android AlertDialog 对话框开启和关闭输入法问题相关推荐

  1. 一对一视频聊天软件源码,Android AlertDialog 对话框

    一对一视频聊天软件源码,Android AlertDialog 对话框实现的相关代码 button = (Button) findViewById(R.id.button_alertDialog);b ...

  2. Android 10.0 开启和关闭护眼模式

    1.概述 在10.0系统的产品定制化中,由于一些定制化开发设备中,需要护眼模式,而护眼模式功能开启和关闭 也需要提供接口供app调用,这就需要在系统api中自定义的服务中,提供开启关闭护眼模式的接口, ...

  3. Android AlertDialog对话框不能阻塞进程

    因为AlertDialog对话框不能阻塞当前进程,如果在对话框后,有继续运行的代码,或有切换界面的代码,对话框会一闪而过,不等用户选择. 正确的做法应该是: if (条件){ AlertDialog ...

  4. Android EditText取消焦点并关闭输入法

    我们在平常的编程中,经常会有利用EditText输入信息的情况. 但是当输入完成后,我们点击别的控件完成此次输入时.焦点往往还在EditText中,并且输入法也还显示在桌面. 利用以下代码,可以取消E ...

  5. android AlertDialog 对话框的基本使用

    /** * @setIcon 设置对话框图标 * @setTitle 设置对话框标题 * @setMessage 设置对话框消息提示 * setXXX方法返回Dialog对象,因此可以链式设置属性 * ...

  6. Android AlertDialog对话框自定义风格的另类实现

    一.引子 学过Android的同学都知道,对话框的重要程度非常高,任何一款 app几乎都离不开对话框,值得庆幸的是,对话框的运用在Android中还是相对比较容易的.虽然很简单,但我在项目中还是碰到些 ...

  7. Android热点的开启和关闭以及监听

    最近在研究android手机开启热点的问题,很是让我头疼.在这里记录一下,让其他的小白们少走些弯路,也方便自己知识的积累. 开启热点: 首先要先创建一个WifiManager WifiManager ...

  8. Android热点的开启和关闭

    今天测试了3台手机, 分别是华为p9.1+3.小米note3,都要用户在应用管理界面设置 允许"修改系统设置"权限(WRITE_SETTINGS是特殊权限,无法动态申请)的前提下, ...

  9. Android开发--Service开启,关闭,绑定,解除

    Android应用程序中有一项非常重要的技术--Service,它没有运行界面,运行在后台,但是有一点非常重要,Service并不是一个单独的进程,同时也不是一个线程,用来处理耗时的动作. Servi ...

最新文章

  1. 安卓禁止ScrollView内的控件改变之后自动滚动
  2. javascript获取asp.net后台代码的方法
  3. 身份验证错误错误指定的句柄无效_基于 Web 端的人脸识别身份验证「实践」
  4. 【JS】实时监控页面,input框数值自动求和
  5. 第二小节之面向对象上
  6. VGGNet原理及tensorflow实现
  7. 虚拟机Class文件结构笔记
  8. GitChat 使用指南,快速学习、飞速成长
  9. Foobar2000使用学习
  10. 爬虫实战——爬取大麦网
  11. 6-29 水上飞机(*) (20分)多重继承
  12. windows系统如何真正隐藏文件夹[转载]
  13. Oracle数据库同义词详解
  14. 《卸甲笔记》-单行函数对比之二
  15. Scratch学习:如何把角色设置成半透明?
  16. videojs中文文档详解_HTTP的世界观(附HTTP/3中文翻译)
  17. CISCO路由器配置完全手册
  18. 量化交易 第十二课 因子数据处理之市值中性化
  19. 遍地喧嚣的智能音箱战场,究竟谁能做出中国的 Echo?
  20. freeswitch对接ims

热门文章

  1. 网考英语和计算机范围,中考英语听说机考周六首考,考生要依据计算机提示作答...
  2. 字符串相似度比较工具
  3. Kepp-alive的实际运用场景(1)
  4. 自适应,响应式以及图片的性能优化(响应式图片)
  5. 充电桩(charging station)是什么?
  6. 一首好听的英文歌lemon tree(柠檬树)的中文歌词
  7. 【欣赏】一组唯美的图片
  8. Unity UGUI屏幕自适应
  9. 小白如何进入IT行业及如何选择培训机构
  10. 努力工作,却永不升职,是种怎样的体验?