InputMethodManager输入法简介

结构
1
2
3
public final class InputMethodManager{
.....
}
类概述

 整个输入法框架(IMF)结构的核心API,应用程序之间进行调度和当前输入法交互。你可以用Context.getSystemService() 取得这一接口的实例。

架构总述

输入法框架(IMF)共有三个主要部分:

  1.   输入法管理器,管理各部分的交互。它是一个客户端API,存在于各个应用程序的context中,用来沟通管理所有进程间交互的全局系统服务。
  2.   输入法(IME) ,实现一个允许用户生成文本的独立交互模块。系统绑定一个当前的输入法。使其创建和生成,决定输入法何时隐藏或者显示它的UI。同一时间只能有一个IME运行。
  3.   客户应用程序,通过输入法管理器控制输入焦点和IME的状态。一次只能有一个客户端使用IME。
常量

第一组:

1
2
3
4
5
6
7
8
// hideSoftInputFromWindow(IBinder, int)中的标志,表示如果用户未显式地显示软键盘窗口,则隐藏窗口。

public static final int HIDE_IMPLICIT_ONLY = 0x0001; //常量值: 1


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

public static final int HIDE_NOT_ALWAYS = 0x0002; // 常量值: 2

第二组:

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

public static final int RESULT_SHOWN = 2; //常量值: 2


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

public static final int RESULT_HIDDEN = 3; //常量值: 3

第三组:

1
2
3
4
5
6
7
8
// showSoftInput(View, int,  ResultReceiver)和hideSoftInputFromWindow(IBinder, int,  ResultReceiver)中ResultReceiver结果代码标志:软键盘窗口不变保持显示时的状态。

public static final int RESULT_UNCHANGED_SHOWN = 0; //常量值: 0


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

public static final int RESULT_UNCHANGED_HIDDEN = 1; //常量值 1

第四组:

1
2
3
4
5
6
7
8
// showSoftInput(View, int)标志,表示隐式显示输入窗口,非用户直接要求。窗口可能不显示。

public static final int SHOW_IMPLICIT = 0x0001;


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

public static final int SHOW_FORCED = 0x0002; //常量值 2
方法
1
2
public void displayCompletions(View view, CompletionInfo[] completions)
// 输入法自动实现该方法
1
2
public InputMethodSubtype getCurrentInputMethodSubtype ()
// 获取当前输入法类型
1
2
public List<InputMethodInfo> getEnabledInputMethodList ()
//获取已启用输入法列表
1
2
public List<InputMethodInfo> getInputMethodList ()
//获取输入法列表
1
2
3
4
5
6
7
public void hideSoftInputFromInputMethod (IBinder token, int flags)

//关闭/隐藏输入法软键盘区域,用户不再看到或与其交互。只能由当前激活输入法调用,因需令牌(token)验证。

参数:
token 在输入法启动时提供令牌验证,验证后可对其进行操作。
flags 提供额外的操作标志。当前可以为0或 HIDE_IMPLICIT_ONLY, HIDE_NOT_ALWAYS等位设置。
1
2
3
4
5
6
7
public boolean hideSoftInputFromWindow (IBinder windowToken, int flags)

//hideSoftInputFromWindow(IBinder, int, ResultReceiver)的无返回值版:从窗口上下文中确定当前接收输入的窗口,隐藏其输入法窗口

参数:
windowToken 由窗口请求View.getWindowToken()返回得到的令牌(token)
flags 提供额外的操作标志。当前可以为0或 HIDE_IMPLICIT_ONLY位设置。
1
2
3
4
5
6
7
8
public boolean hideSoftInputFromWindow (IBinder windowToken, int flags, ResultReceiver resultReceiver)

//从窗口上下文中确定当前接收输入的窗口,要求隐藏其软键盘窗口。它可由用户调用并得到结果而不仅仅是显式要求输入法窗口隐藏。

参数:
windowToken 由窗口请求View.getWindowToken()返回得到的令牌(token)
flags 提供额外的操作标志。当前可以为0或 HIDE_IMPLICIT_ONLY位设置。
resultReceiver 如不为空,当IME处理请求告诉你完成时调用。你收到的结果码可以是RESULT_UNCHANGED_SHOWN, RESULT_UNCHANGED_HIDDEN, RESULT_SHOWN, 或RESULT_HIDDEN。
1
2
public void hideStatusIcon (IBinder imeToken)
//隐藏状态栏图标
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public boolean isAcceptingText ()
//当前服务视图接受全文编辑返回真。没有输入法联接为false,这时其只能处理原始按键事件。

public boolean isActive (View view)
//视图为当前输入的激活视图时返回真。

public boolean isActive ()
//输入法中的任意视图激活时返回真。

public boolean isFullscreenMode ()
//判断相关输入法是否以全屏模式运行。全屏时,完全覆盖你的UI时,返回真,否则返回假。

public boolean isWatchingCursor (View view)
//如当前输入法要看到输入编辑者的光标位置时返回真。
1
2
3
4
5
6
public void restartInput (View view)

//如有输入法联接至视图,重启输入以显示新的内容。可在以下情况时调用此方法:视图的文字导致输入法外观变化或有按键输入流,如应用程序调用TextView.setText()时。

参数:
view 文字发生变化的视图。
1
2
3
4
5
6
7
8
public void sendAppPrivateCommand (View view, String action, Bundle data)

//对当前输入法调用 InputMethodSession.appPrivateCommand()。

参数:
view 可选的发送命令的视图,如你要发送命令而不考虑视图附加到输入法,此项可以为空。
action 执行的命令名称。必须是作用域的名称,如前缀包名称,这样不同的开发者就不会创建冲突的命令。
data 命令中包含的任何数据。
1
2
3
4
5
6
public void setInputMethod (IBinder token, String id)
//强制切换到新输入法部件。只能由持有token的应用程序(application)或服务(service) 调用当前激活输入法。

参数:
token 在输入法启动时提供令牌验证,验证后可对其进行操作。
id 切换到新输入法的唯一标识。
1
2
3
4
5
6
7
8
public void setInputMethodAndSubtype (IBinder token, String id, InputMethodSubtype subtype)

//强制切换到一个新的输入法和指定的类型。只能由持有token的应用程序(application)或服务(service) 调用当前激活输入法。

参数:
token 在输入法启动时提供令牌验证,验证后可对其进行操作。
id 切换到新输入法的唯一标识。
subtype 切换到新输入法的新类型。
1
2
public void showInputMethodPicker ()
//显示输入法菜单列表
1
2
public void showStatusIcon (IBinder imeToken, String packageName, int iconId)
//显示状态栏图标
1
2
public void toggleSoftInput (int showFlags, int hideFlags)
//切换软键盘
1
2
3
4
5
6
7
8
public void toggleSoftInputFromWindow (IBinder windowToken, int showFlags, int hideFlags)

//本方法切换输入法的窗口显示。如输入窗口已显示,它隐藏。如无输入窗口则显示。

参数:
windowToken 由窗口请求View.getWindowToken()返回得到的令牌(token)
showFlags 提供额外的操作标志。当前可以为0或 HIDE_IMPLICIT_ONLY位设置。
hideFlags 提供额外的操作标志。可以是0或 HIDE_IMPLICIT_ONLY, HIDE_NOT_ALWAYS位设置。
1
2
public void updateCursor (View view, int left, int top, int right, int bottom)
//返回窗口的当前光标位置。
1
2
public void updateExtractedText (View view, int token, ExtractedText text)
//当内容变化时文本编辑器调用此方法,通知其新提取文本。
1
2
public void updateSelection (View view, int selStart, int selEnd, int candidatesStart, int candidatesEnd)
//返回当前选择区域。
1
2
3
4
5
6
7
8
public boolean showSoftInput (View view, int flags, ResultReceiver resultReceiver)

//如需要,显式要求当前输入法的软键盘区域向用户显示。当用户与视图交互,用户表示要开始执行输入操作时,可以调用此方法。

参数:
view 当前焦点视图,可接受软键盘输入。
flags 提供额外的操作标志。当前可以是0或SHOW_IMPLICIT 位设置。
resultReceiver 如不为空,当IME处理请求告诉你完成时调用。你收到的结果码可以是RESULT_UNCHANGED_SHOWN, RESULT_UNCHANGED_HIDDEN, RESULT_SHOWN, 或 RESULT_HIDDEN 。
1
2
3
4
5
6
7
public boolean showSoftInput (View view, int flags)

//showSoftInput(View, int, ResultReceiver)的无返回值版:如需要,显式要求当前输入法的软键盘区域向用户显示。

参数:
view 当前焦点视图,可接受软键盘输入。
flags 提供额外的操作标志。当前可以是0或SHOW_IMPLICIT 位设置。
1
2
3
4
5
6
7
public void showSoftInputFromInputMethod (IBinder token, int flags)

//显示输入法的软键盘区域,这样用户可以到看到输入法窗口并能与其交互。只能由当前激活输入法调用,因需令牌(token)验证。

参数:
token 在输入法启动时提供令牌验证,验证后可对其进行操作。
flags 提供额外的操作标志。可以是0或 SHOW_IMPLICIT, SHOW_FORCED位设置。
常用法
调用显示系统默认的输入法

方法一:

1
2
3
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);

imm.showSoftInput(m_receiverView(接受软键盘输入的视图(View)),InputMethodManager.SHOW_FORCED(提供当前操作的标记,SHOW_FORCED表示强制显示));

方法二:

1
2
3
InputMethodManager imm=(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);

imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); (这个方法可以实现输入法在窗口上切换显示,如果输入法在窗口上已经显示,则隐藏,如果隐藏,则显示输入法到窗口上)
调用隐藏系统默认的输入法
1
2
3
4
5
InputMethodManager imm=(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);

imm.hideSoftInputFromWindow(editText.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

//(editText是一个EditText对象)
获取输入法的开关状态
1
2
3
4
5
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);

boolean isOpen=imm.isActive();

//isOpen若返回true,则表示输入法打开
不自动弹出键盘

带有EditText控件的在第一次显示的时候会自动获得focus,并弹出键盘,如果不想自动弹出键盘,有两种方法:

法一:

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

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

法二:

可以在布局中放一个隐藏的TextView,然后在onCreate的时候requsetFocus。注意TextView不要设置Visiable=gone,否则会失效。

1
2
3
4
5
6
7
8
9
10
11
<TextView
android:id="@+id/text_notuse"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="true"
android:focusableInTouchMode="true" />



TextView textView = (TextView)findViewById(R.id.text_notuse);
textView.requestFocus();
应用启动后自动打开输入法
1
2
3
4
5
6
7
8
9
10
11
/** 
* 用一个定时器控制当打开这个Activity的时候就出现软键盘
*/
Timer timer=new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
InputMethodManager inputMethodManager=(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
}
}, 2000);
单机触发软键盘
1
2
3
4
5
6
7
8
/** 
* 当单击事件的时候触发显示软键盘
*/
@Override
public void onClick(View v) {
InputMethodManager imm=(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
}
0%