android中,要使控件获得焦点,需要先setFocus,再requestFocus。
以Button为例:
btn.setFocusable(true);
btn.setFocusableInTouchMode(true);
btn.requestFocus();
btn.requestFocusFromTouch();
//获得失去焦点的监听器
btn.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
// TODO Auto-generated method stub
if (hasFocus) {
btn_box.setBackgroundResource(R.drawable.book_green);
}else {
btn_box.setBackgroundResource(R.drawable.book);
}
}
});
获取焦点是获取焦点,弹输入法是弹输入法。获取焦点后并不一定会弹出输入法,在网上搜了一圈,主流回答是“还有就是已开启界面就是focus的text的话有可能也是不行的,UI渲染是需要时间的”......
由于对源码不懂,我对这一点也没有个全面的认识。只能将焦点和输入法分成两块来处理。焦点的打开和关闭特别简单。
焦点的获取:
titleInput.setFocusable(true);
titleInput.requestFocus();
焦点的取消:
titleInput.setFocusable(false);
1、打开输入法窗口:
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
// 接受软键盘输入的编辑文本或其它视图
imm.showSoftInput(submitBt,InputMethodManager.SHOW_FORCED);
2、关闭出入法窗口
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(OpeListActivity.this.getCurrentFocus().getWindowToken(),
InputMethodManager.HIDE_NOT_ALWAYS);
//接受软键盘输入的编辑文本或其它视图inputMethodManager
.showSoftInput(submitBt,InputMethodManager.SHOW_FORCED);
3、如果输入法打开则关闭,如果没打开则打开
InputMethodManager m=(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
m.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
4、获取输入法打开的状态
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
boolean isOpen=imm.isActive();
isOpen若返回true,则表示输入法打开
常量
public static final int HIDE_IMPLICIT_ONLY
hideSoftInputFromWindow(IBinder, int)中的标记,默示若是用户未显式地显示软键盘窗口,则隐蔽窗口。
常量值: 1 (0 x00000001)
public static final int HIDE_NOT_ALWAYS
hideSoftInputFromWindow(IBinder, int)中的标记,默示软键盘窗口老是隐蔽,除非开端时以SHOW_FORCED显示。
常量值: 2 (0 x00000002)
public static final int RESULT_HIDDEN
showSoftInput(View, int, ResultReceiver)和hideSoftInputFromWindow(IBinder, int, ResultReceiver)中ResultReceiver成果代码标记:软键盘窗口从显示切换到隐蔽时的状况。
常量值: 3 (0 x00000003)
public static final int RESULT_SHOWN
showSoftInput(View, int, ResultReceiver)和hideSoftInputFromWindow(IBinder, int, ResultReceiver)中ResultReceiver成果代码标记:软键盘窗口从隐蔽切换到显示时的状况。
常量值: 2 (0 x00000002)
public static final int RESULT_UNCHANGED_HIDDEN
showSoftInput(View, int, ResultReceiver)和hideSoftInputFromWindow(IBinder, int, ResultReceiver)中ResultReceiver成果代码标记:软键盘窗口不变对峙隐蔽时的状况。
常量值: 1 (0 x00000001)
public static final int RESULT_UNCHANGED_SHOWN
showSoftInput(View, int, ResultReceiver)和hideSoftInputFromWindow(IBinder, int, ResultReceiver)中ResultReceiver成果代码标记:软键盘窗口不变对峙显示时的状况。
常量值: 0 (0 x00000000)
public static final int SHOW_FORCED
showSoftInput(View, int)标记,默示用户强迫打开输入法(如长按菜单键),一向对峙打开直至只有显式封闭。
常量值: 2 (0 x00000002)
public static final int SHOW_IMPLICIT
showSoftInput(View, int)标记,默示隐式显示输入窗口,非用户直接请求。窗口可能不显示。
常量值: 1 (0 x00000001)
四、公共办法
public void displayCompletions (View view, CompletionInfo[] completions)
(译者注:输入法主动完成)
public InputMethodSubtype getCurrentInputMethodSubtype ()
(译者注:获取当前输入法类型?)
public List<InputMethodInfo> getEnabledInputMethodList ()
(译者注:获取已启用输入法列表?)
public List<InputMethodSubtype> getEnabledInputMethodSubtypeList (InputMethodInfo imi, boolean allowsImplicitlySelectedSubtypes)
public List<InputMethodInfo> getInputMethodList ()
(译者注:获取输入法列表)
public Map<InputMethodInfo, List<InputMethodSubtype>> getShortcutInputMethodsAndSubtypes ()
public void hideSoftInputFromInputMethod (IBinder token, int flags)
封闭/隐蔽输入法软键盘区域,用户不再看到或与其交互。只能由当前激活输入法调用,因需令牌(token)验证。
参数
token 在输入法启动时供给令牌验证,验证后可对其进行操纵。
flags 供给额外的操纵标记。当前可认为0或 HIDE_IMPLICIT_ONLY, HIDE_NOT_ALWAYS等位设置。
public boolean hideSoftInputFromWindow (IBinder windowToken, int flags)
hideSoftInputFromWindow(IBinder, int, ResultReceiver)的无返回值版:从窗口高低文中断定当前接管输入的窗口,隐蔽其输入法窗口
参数
windowToken 由窗口恳求View.getWindowToken()返回获得的令牌(token)。
flags 供给额外的操纵标记。当前可认为0或 HIDE_IMPLICIT_ONLY位设置。
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。
public void hideStatusIcon (IBinder imeToken)
(译者注:隐蔽状况栏图标?)
public boolean isAcceptingText ()
当前办事视图接管全文编辑返回真。没有输入法联接为false,这时其只能处理惩罚原始按键事务。
public boolean isActive (View view)
视图为当前输入的激活视图时返回真。
public boolean isActive ()
输入法中的随便率性视图激活时返回真。
public boolean isFullscreenMode ()
断定相干输入法是否以全屏模式运行。全屏时,完全覆盖你的UI时,返回真,不然返回假。
public boolean isWatchingCursor (View view)
如当前输入法要看到输入编辑者的光标地位时返回真。
public void restartInput (View view)
如有输入法联接至视图,重启输入以显示新的内容。可在以下景象时调用此办法:视图的文字导致输入法外观变更或有按键输入流,如应用法度调用TextView.setText()时。
参数
view 文字产生变更的视图。
public void sendAppPrivateCommand (View view, String action, Bundle data)
对当前输入法调用 InputMethodSession.appPrivateCommand()。
参数
view 可选的发送号令的视图,如你要发送号令而不推敲视图附加到输入法,此项可认为空。
action 履行的号令名称。必须是感化域的名称,如前缀包名称,如许不合的开辟者就不会创建冲突的号令。
data 号令中包含的任何数据。
public boolean setCurrentInputMethodSubtype (InputMethodSubtype subtype)
(译者注:此办法为3.0中新增的办法)
public void setInputMethod (IBinder token, String id)
强迫切换到新输入法部件。只能由持有token的应用法度(application)或办事(service)调用当前激活输入法。
参数
token 在输入法启动时供给令牌验证,验证后可对其进行操纵。
id 切换到新输入法的独一标识。
public void setInputMethodAndSubtype (IBinder token, String id, InputMethodSubtype subtype)
强迫切换到一个新的输入法和指定的类型。只能由持有token的应用法度(application)或办事(service)调用当前激活输入法。(译者注:此办法为3.0中新增的办法)
参数
token 在输入法启动时供给令牌验证,验证后可对其进行操纵。
id 切换到新输入法的独一标识。
subtype 切换到新输入法的新类型。
public void showInputMethodAndSubtypeEnabler (String topId)
(译者注:此办法为3.0中新增的办法)
public void showInputMethodPicker ()
(译者注:显示输入法菜单列表)
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 。
public boolean showSoftInput (View view, int flags)
showSoftInput(View, int, ResultReceiver)的无返回值版:如须要,显式请求当前输入法的软键盘区域向用户显示。
参数
view 当前核心视图,可接管软键盘输入。
flags 供给额外的操纵标记。当前可所以0或SHOW_IMPLICIT 位设置。
public void showSoftInputFromInputMethod (IBinder token, int flags)
显示输入法的软键盘区域,如许用户可以到看到输入法窗口并能与其交互。只能由当前激活输入法调用,因需令牌(token)验证。
参数
token 在输入法启动时供给令牌验证,验证后可对其进行操纵。
flags 供给额外的操纵标记。可所以0或 SHOW_IMPLICIT, SHOW_FORCED位设置。
public void showStatusIcon (IBinder imeToken, String packageName, int iconId)
(译者注:显示状况栏图标?)
public boolean switchToLastInputMethod (IBinder imeToken)
public void toggleSoftInput (int showFlags, int hideFlags)
(译者注:切换软键盘)
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位设置。
public void Cursor (View view, int left, int top, int right, int bottom)
返回窗口的当前光标地位。
public void ExtractedText (View view, int token, ExtractedText text)
(译者注:当内容变更时文本编辑器调用此办法,通知其新提取文本。)
public void Selection (View view, int selStart, int selEnd, int candidatesStart, int candidatesEnd)
返回当前选择区域。