方法一(如果输入法在窗口上已经显示,则隐藏,反之则显示)

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);

方法二(view为接受软键盘输入的视图,SHOW_FORCED表示强制显示)

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(view,InputMethodManager.SHOW_FORCED); //显示输入盘
imm.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.RESULT_UNCHANGED_SHOWN); //强制隐藏键盘

自动弹出输入法

mCommentEdittext.setFocusable(true);
mCommentEdittext.setFocusableInTouchMode(true);
mCommentEdittext.requestFocus();
InputMethodManager inputManager = (InputMethodManager) mCommentEdittext.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.showSoftInput(mCommentEdittext, 0);

调用隐藏系统默认的输入法

((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(WidgetSearchActivity.this.getCurrentFocus().getWindowToken()
      , InputMethodManager.HIDE_NOT_ALWAYS);
WidgetSearchActivity是当前的Activity
注意!以上的隐藏是调用activity的getCurrentFocus().getWindowToken().但是,这个调用在华为品牌的手机上会出现空指针报错.所以为了适配华为最安全的写法还是添加一个view,如下:
mInputMethodManager.hideSoftInputFromWindow(mContentView.getWindowToken()
, InputMethodManager.HIDE_NOT_ALWAYS);//隐藏输入法
 

获取输入法打开的状态

这个方法有点不太可靠

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
boolean isOpen=imm.isActive();//isOpen若返回true,则表示输入法打开

计算屏幕的方式监听输入法是否打开

碎片里调用

private void initGlobalLayoutListener(){
mGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
int mScreenHeight = 0;
int mKeyboardHeight = 0;
@Override
public void onGlobalLayout() { Rect rect = new Rect();
// 测量当前窗口的显示区域
((Activity)getContext()).getWindow().getDecorView()
.getWindowVisibleDisplayFrame(rect);
if(mScreenHeight <= 0){
mScreenHeight = ((WindowManager) getContext()
.getSystemService(Context.WINDOW_SERVICE))
.getDefaultDisplay().getHeight();
}
//计算出软键盘的高度
int keyboardHeight = mScreenHeight - rect.bottom; //如果keyboardHeight大于屏幕的五分之一,
// 此时keyboardHeight有效,反之就是软键盘已经关闭了。
if (Math.abs(keyboardHeight) > mScreenHeight / 5) {
mKeyboardHeight = keyboardHeight;
L.e("已经触发键盘");
}else {
L.e("没有触发键盘"); }
}
};
mRootLayout.getViewTreeObserver().addOnGlobalLayoutListener(mGlobalLayoutListener);//给xml里的根布局设置监听
}

正常activity调用

private void initGlobalLayoutListener(){
mGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
int mScreenHeight = 0;
int mKeyboardHeight = 0;
@Override
public void onGlobalLayout() { Rect rect = new Rect();
// 测量当前窗口的显示区域
DemoActivity.this.getWindow().getDecorView()
.getWindowVisibleDisplayFrame(rect);
if(mScreenHeight <= 0){
WindowManager windowManager = (WindowManager) DemoActivity.this.getSystemService(Context.WINDOW_SERVICE);
mScreenHeight = windowManager.getDefaultDisplay().getHeight(); }
//计算出软键盘的高度
int keyboardHeight = mScreenHeight - rect.bottom; //如果keyboardHeight大于屏幕的五分之一,
// 此时keyboardHeight有效,反之就是软键盘已经关闭了。
if (Math.abs(keyboardHeight) > mScreenHeight / 5) {
mKeyboardHeight = keyboardHeight;
L.e("已经触发键盘");
}else {
L.e("没有触发键盘");
}
}
};
mRootLayout.getViewTreeObserver().addOnGlobalLayoutListener(mGlobalLayoutListener);//给xml里的根布局设置监听
}

记得移除监听

@Override
public void onPause() {
super.onPause();
mRootLayout.getViewTreeObserver().removeOnGlobalLayoutListener(mGlobalLayoutListener);
}

进入activity就要显示输入法

在清单文件对应的activity配置中加入一句Android:windowSoftInputMode="stateVisible|adjustResize"

不显示输入法

android:windowSoftInputMode="stateHidden"

根据输入法位置改变,改变输入框位置

android:windowSoftInputMode的值adjustPan或者adjustResize即可,像这样:

<activity
android:name=".MainActivity"
android:windowSoftInputMode="adjustPan" >
...
</activity>
  • stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置
  • stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示
  • stateHidden:用户选择activity时,软键盘总是被隐藏
  • stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的
  • stateVisible:软键盘通常是可见的
  • stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态
  • adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示
  • adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间
  • adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分

在Fragment里设置输入法

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

end

Android开发 输入法调用学习的更多相关文章

  1. Android开发系列之学习路线图

    通过前面的3篇博客已经简单的介绍了Android开发的过程并写了一个简单的demo,了解了Android开发的环境以及一些背景知识. 接下来这篇博客不打算继续学习Android开发的细节,先停一下,明 ...

  2. android开发中调用python代码(带参数)

    android开发主要用到的是java代码,但是当开发涉及到一些算法时,往往用python可以提高软件的运行速度,也更加便捷,这里分享自己项目调用python代码的方式,主要有以下几个步骤(个人方法, ...

  3. Android 开发--CMakeList调用本地so文件

    这里写代码片Android开发常常遇到Java调用so文件的情况,本文介绍一下Google最近新推出的应用在android studio中的方法–cmakelist.txt格式调用. so文件分为jn ...

  4. 在Android开发中调用Rest web服务(转)

    首先从维基百科上拷贝一点Rest的基本概念给大家看看,然后我们再开始详解在Android中如何调用Rest服务.表象化状态转变(英文:Representational State Transfer,简 ...

  5. Android 开发笔记“调用.net webservice遇到的问题”

    1.An exception occurred: org.ksoap2.SoapFault SoapFault - faultcode: 'soap:Server' faultstring: '服务器 ...

  6. android开发艺术探索学习 之 结合Activity的生命周期了解Activity的LaunchMode

    转载请标明出处: http://blog.csdn.net/lxk_1993/article/details/50749728 本文出自:[lxk_1993的博客]: 首先还是先介绍下Activity ...

  7. Android开发艺术探索学习笔记(三)

    第三章  View的事件体系 3.1 View基础知识 3.1.1 什么是view View 是Android中所有控件的基类,是一种界面层的控件的一种抽象,它代表了一个控件. 3.1.2 View的 ...

  8. Android开发艺术探索学习笔记(十一)

    第十一章  Android的线程和线程池 从用途上来说,线程分为子线程和主线程,主线程主要处理和界面相关的事情,而子线程往往用于执行耗时的操作.AsyncTask,IntentService,Hand ...

  9. ArcGIS Runtime SDK for Android开发之调用GP服务(异步调用)

    一.背景说明 通过调用GP服务,Android客户端也能实现专业的.复杂的GIS分析处理功能,从而增加应用的实用价值. ArcGIS Server发布的GP服务,分为同步和异步两种类型,一般执行步骤较 ...

随机推荐

  1. JVM内核-原理、诊断与优化学习笔记(七):性能监控工具

    文章目录 系统性能监控 系统性能监控- linux uptime top vmstat(虚拟内存统计) pidstat 系统性能监控 - windows 任务管理器 Perfmon Process E ...

  2. ncurse 笔记

    初始化与结束 为了使用 NCURSES 库,你应该 #include <curses.h>,在编译时,应该加上 -lncurses. stdscr 一般地,第一个函数调用必须是 inits ...

  3. python语法基础(类)

    一.什么是类? 类是具有相同属性的一类事物 类还有功能和属性,属性就是这类事物的特征,而功能就是它能做什么,也是就是方法或者函数. 在python中类用关键词class来声明 二.类的声明 类的声明方 ...

  4. ES6 学习 -- Generator函数

    (1)语法说明:Generator函数其实是一个普通函数,其有两个特点,一是,function关键字与函数名之间有一个星号(*):二是Generator函数内部使用yield表达式,定义不同的状态,然 ...

  5. pytorch,cuda8,torch.cuda.is_available return flase (ubuntu14)

    因为ubuntu 系统是14.0的,安装pytorch1.0的时候,本身已经安装好了cuda8,在验证gpu的时候,torch.cuda.is_available()返回false 安装命令是: co ...

  6. lunix查询jdk安装路径

    在linux系统查找jdk的安装路径:whereis javawhich java (java执行路径)echo $JAVA_HOME echo $PATH在windows查找jdk的安装路径:set ...

  7. Mysql优化-字段设计

    摘抄并用于自查笔记 1. 对精度有要求decimal float 类型用于表示单精度浮点数值,而double类型用于表示双精度浮点数值,float 和 double 都是浮点型,而 decimal 是 ...

  8. mysql-connetor-c 自动创建数据库、数据库表的命令

    1.首先连接MySQL默认的数据库mysql // 参数说明: // strIP: MySQL数据库的IP地址 // nPort: MySQL数据库的端口号 // strDBName: 要连接的数据库 ...

  9. QT安装以及使用(QT支持linux和windows,也支持C/C++代码的编译运行,比vs简洁多)

    Windows: 0. QT Versionqt-win-opensource-4.7.4-mingwqt-creator-win-opensource-2.4.1 1. 系统Windows 7 &a ...

  10. CommonsMultipartResolver 文件上传

    依赖 <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fi ...