提起输入法我就想到了Edittext,输入法可以自动根据inputType来改变键盘的布局,在支付钱包中还特别隐藏的系统自带的输入法,直接让用户用软件自己的输入法,提高了安全性。所以,我们应该对输入法这个东西有些了解,让输入法为自己所用。

一、获取输入管理对象

final InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);

二、操作输入法

1. 强制显示输入法

通过测试,我发现强制显示输入法必须要用一个editText来做,其实也挺正常的,输入法本身就是给editText输入用的,所以自然要定义一个editText。

布局文件中我用了一个editText和两个button

在Java代码中,我们要找到这个editText,然后进行如下操作:

inputMethodManager.showSoftInput(editText, InputMethodManager.SHOW_FORCED);

全部代码:

        final EditText editText = (EditText)findViewById(R.id.editText);

        final InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
Button showBtn = (Button) findViewById(R.id.input_button); showBtn.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) { inputMethodManager.showSoftInput(editText, InputMethodManager.SHOW_FORCED); }
});

2. 强制隐藏输入法

用的布局文件还是刚刚那个,隐藏输入法就不需要editText了。直接在button的点击事件中写下面的代码就行。

inputMethodManager.hideSoftInputFromWindow(v.getWindowToken(), 0);

全部代码:

Button hideBtn = (Button)findViewById(R.id.hide_button);
hideBtn.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
// TODO 自动生成的方法存根
inputMethodManager.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
});

3. 根据输入法状态来显示/隐藏输入法

有时候我们需要根据输入法的状态来做处理:如果输入法已经显示,那么就隐藏它;如果输入法现在没显示,那么就显示它。

inputMethodManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);

全部代码:

        btn.setOnClickListener(new OnClickListener() {

            @Override
public void onClick(View v) {
inputMethodManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
}
});

4. 不自动弹出键盘

带有EditText控件的在第一次显示的时候会自动获得focus,并弹出键盘,如果不想弹出输入法,可以在Activity的oncreat中写上这行代码

// 禁止自动弹出输入框
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
// this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
// 用这个可以防止自动弹出那个输入法的Fragment.

也可以在mainfest文件中把对应的activity设置

android:windowSoftInputMode="stateHidden" 或者android:windowSoftInputMode="stateUnchanged"。

     <activity Android:name=".Main"
Android:label="@string/app_name"
Android:windowSoftInputMode="adjustUnspecified|stateHidden"
Android:configChanges="orientation|keyboardHidden">
<intent-filter>
<action Android:name="android.intent.action.MAIN" />
<category Android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

三、输入法常量

public static final int HIDE_IMPLICIT_ONLY

    hideSoftInputFromWindow(IBinder, int)中的标志,表示如果用户未显式地显示软键盘窗口,则隐藏窗口。

public static final int HIDE_NOT_ALWAYS

    hideSoftInputFromWindow(IBinder, int)中的标志,表示软键盘窗口总是隐藏,除非开始时以SHOW_FORCED显示。

public static final int RESULT_HIDDEN

    showSoftInput(View, int, ResultReceiver)和hideSoftInputFromWindow(IBinder, int, ResultReceiver)中ResultReceiver结果代码标志:软键盘窗口从显示切换到隐藏时的状态。

public static final int RESULT_SHOWN

    showSoftInput(View, int, ResultReceiver)和hideSoftInputFromWindow(IBinder, int, ResultReceiver)中ResultReceiver结果代码标志:软键盘窗口从隐藏切换到显示时的状态。

public static final int RESULT_UNCHANGED_HIDDEN

    showSoftInput(View, int, ResultReceiver)和hideSoftInputFromWindow(IBinder, int, ResultReceiver)中ResultReceiver结果代码标志:软键盘窗口不变保持隐藏时的状态。

public static final int RESULT_UNCHANGED_SHOWN

    showSoftInput(View, int, ResultReceiver)和hideSoftInputFromWindow(IBinder, int, ResultReceiver)中ResultReceiver结果代码标志:软键盘窗口不变保持显示时的状态。

public static final int SHOW_FORCED

    showSoftInput(View, int)标志,表示用户强制打开输入法(如长按菜单键),一直保持打开直至只有显式关闭。

public static final int SHOW_IMPLICIT

      showSoftInput(View, int)标志,表示隐式显示输入窗口,非用户直接要求。窗口可能不显示。

四、动态改变输入法键盘布局

我们知道EditText可以设置输入的类型,这样就能直接控制输入法的键盘布局了。但如果我们想要在代码中动态改变输入的类型呢?

//设置用户名的输入框是可以输入数字和字母的
usernameEt.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL);

usernameEt是一个editText,通过代码设置输入类型的方法是setInputType,后面传入不同的常量就可以设置不同的输入类型了。这点是editText中的知识,反正和输入法有关,所以就顺便提一下。

五、输入法和Activity视图的关系

输入法再怎么特殊,它也就是一个在phoneWindow中绘制的view,你可以把它当作一个dialog,因此它自然有它自己的位置。而它的位置又是由activity指定的,下面来分析下它的布局。

1. Activity初始时的布局

我在activity的上下各放了一个textview来表示activityview的顶端和末端。运行出来的效果如下:

2.  android:windowSoftInputMode="stateUnspecified"

我们在activity定义时加上这句话就表明,输入法按照默认的模式显示,软键盘的状态(隐藏或可见)没有被指定。系统将选择一个合适的状态或依赖于主题的设置。

<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:windowSoftInputMode="stateUnspecified">

当我们点击show input后,跳出输入法

效果:

可以看到,输入法直接盖到了原来的activity上了,下面的bottom直接被盖住了。如果想要看到被盖住的文字,必须要给布局外层套一个scrollView才行。

3. android:windowSoftInputMode="stateVisible"

这个模式下,activity和输入法是同时出现的,也就是说activity启动后输入法也会启动,不用我们点击show input。效果和上面一样,输入法盖住了下面的文字。

4. android:windowSoftInputMode="stateAlwaysVisible"

和上面的一样,但解释是,用户选择这个activity时,键盘是可见的。我的理解是如果这个activity获取了焦点,那么键盘会自动出现。感觉和上面的没啥区别。

5. android:windowSoftInputMode="stateHidden"

在activity中有edittext时也不显示输入法,也就是说只有当你点击了editText后输入法才会出现。效果是盖住下面的bottom文字。

6. android:windowSoftInputMode="stateAlwaysHidden"

这个和上面的一样,也是不自动显示输入法。效果和也是盖住下面的文字。

7. android:windowSoftInputMode="adjustResize"

压缩模式。当输入法出现时,activity重新调整界面的布局,让原来的界面和输入法处于同一个平面中。效果如下,可以明显的看到bottom没有被压住。

8.android:windowSoftInputMode="adjustPan"

平移模式。当输入框不会被遮挡时,该模式没有对布局进行调整,然而当输入框将要被遮挡时, 窗口就会进行平移。也就是说,该模式始终是保持输入框为可见

后来

经过测试发现,现在设置editText的requestFocuse没有用了,如果希望已进入界面就显示输入法,那么必须要在activity的配置文件中进行输入法的指定,比如像下面这样:

android:windowSoftInputMode="stateVisible|adjustPan"

如果在有输入法显示的界面中,你手动调用finish方法,你会发现输入法是不会消失的。所以如果遇到这样的界面,需要复写finish()然后强制关闭输入法。

参考自:

http://my.oschina.net/jbcao/blog/61035

http://www.cnblogs.com/weixing/p/3300908.html

http://blog.csdn.net/blueangle17/article/details/12753397

Android中的输入法的更多相关文章

  1. Android中EditTex焦点设置和弹不弹出输入法的问题(转)

    今天编程碰到了一个问题:有一款平板,打开一个有EditText的Activity会默认弹出输入法.为了解决这个问题就深入研究了下android中焦点Focus和弹出输入法的问题.在网上看了些例子都不够 ...

  2. Android 中常见控件的介绍和使用

    1 TextView文本框 1.1 TextView类的结构 TextView 是用于显示字符串的组件,对于用户来说就是屏幕中一块用于显示文本的区域.TextView类的层次关系如下: java.la ...

  3. android中的EditView控件

    android中的EditView控件 EditText继承关系:View-->TextView-->EditText ,EditText是可编辑文本框 1.EditText默认情况下,光 ...

  4. android中的TextView控件

    我以前是搞ssh开发的,现在在搞android开发,所以简单学习了一下,对于自己所了解的做一个记录,也算是一个笔记吧,如果有什么不对的,希望大家给予一定的指导.  一.TextView的基本使用 Te ...

  5. android 的开源输入法介绍,及 自动触摸的实现方法

    输入法的开源代码见我自己的360云盘里的 openwnn-legacy-android-open-ime.tar.bz2 文件 http://www.pocketmagic.net/injecting ...

  6. 【转】Android中EditText中的InputType类型含义与如何定义

    原文网址:http://www.crifan.com/summary_android_edittext_inputtype_values_and_meaning_definition/ 经过一些And ...

  7. Android中Edittext的属性

    //此为转载别人的,挺不错的 1.EditText输入的文字为密码形式的设置 (1)通过.xml里设置: 把该EditText设为:android:password="true"  ...

  8. 《安卓网络编程》之第六篇 Android中的WIFI和蓝牙

    关于WIFI就不多介绍啦,直接来个段子吧. 问:“WiFi对人体有伤害么?” 答:“不清楚,反正没有WiFi我就浑身不舒服. 比较重要的一点就是WifiManager  wm=(WifiManager ...

  9. Android中软键盘弹出时底部菜单上移问题

    当在Android的layout设计里面如果输入框过多,则在输入弹出软键盘的时候,下面的输入框会有一部分被软件盘挡住,从而不能获取焦点输入. 解决办法: 方法一:在你的activity中的oncrea ...

随机推荐

  1. Linux系统运维笔记(四),CentOS 6.4安装 MongoDB

    Linux系统运维笔记(四),CentOS 6.4安装 MongoDB 1,下载 https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.6 ...

  2. 【LOJ】#2117. 「HNOI2015」实验比较

    题解 把所有=的点连起来,一个图合法肯定它是一个有向树森林 我们新建一个点,把这个点和其他所有树的树根连起来 定义\(dp[u][j]\)表示第u个点长度为j的序列的方案数 转移方法是 \(dp[u] ...

  3. Linux性能优化之内存优化(二)

    前言 不知道大家看完前面一章关于CPU优化,是否受到相应的启发呢?如果遇到任何问题,可以留言和一起探讨这方面的问题.接下来我们介绍一些关于内存方面的知识.内存管理软件包括虚拟内存系统.地址转换.交换. ...

  4. MySQL的lock tables和unlock tables的用法(转载)

    早就听说lock tables和unlock tables这两个命令,从字面也大体知道,前者的作用是锁定表,后者的作用是解除锁定.但是具体如何用,怎么用,不太清楚.今天详细研究了下,总算搞明白了2者的 ...

  5. AI技术在智能海报设计中的应用

    背景 在视觉设计领域中,设计师们往往会因为一些简单需求付出相当多的时间,比如修改文案内容,设计简单的海报版式,针对不同机型.展位的多尺寸拓展等.这些工作需要耗费大量的时间.人力成本(5~6张/人日), ...

  6. 「BZOJ 3645」小朋友与二叉树

    「BZOJ 3645」小朋友与二叉树 解题思路 令 \(G(x)\) 为关于可选大小集合的生成函数,即 \[ G(x)=\sum[i\in c ] x^i \] 令 \(F(x)\) 第 \(n\) ...

  7. PHP 获取IP地址位置信息「聚合数据API」

    聚合数据 提供了[查询IP所属区域]的服务接口,只需要以 GET 请求的方式向 API 传入 IP地址 和 APPKEY 即可获得查询结果. 这里的难点主要在于如何通过PHP获取客户端IP地址,以及如 ...

  8. ROS知识(21)----ROS C++代码格式化

    这里提供两种方法. 第一种方法:clang_format 1.安装clang format sudo apt-get install -y clang-format-3.6 2.从github的ros ...

  9. j.u.c系列(09)---之并发工具类:CyclicBarrier

    写在前面 CyclicBarrier是一个同步辅助类,允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).因为该 barrier 在释放等待线程后可以重用,所以 ...

  10. 再谈JavaScript中的闭包

    一.什么是闭包 闭包就是有权访问另一个函数作用域中变量的函数,因此,闭包的本质是一个函数.当一个内部函数被保存到外部时,就会生成闭包. 二.闭包的作用 1.实现公有变量,即通过局部变量实现全局变量的效 ...