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
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
常量值: 1 (0 x00000001)
四、公共办法
public void displayCompletions (View view, CompletionInfo[] completions)
(译者注:输入法主动完成)
public InputMethodSubtype getCurrentInputMethodSub
(译者注:获取当前输入法类型?)
public List<InputMethodInfo> getEnabledInputMethodLis
(译者注:获取已启用输入法列表?)
public List<InputMethodSubtype> getEnabledInputMethodSub
public List<InputMethodInfo> getInputMethodList ()
(译者注:获取输入法列表)
public Map<InputMethodInfo, List<InputMethodSubtype>> getShortcutInputMethodsA
public void hideSoftInputFromInputMe
封闭/隐蔽输入法软键盘区域,用户不再看到或与其交互。只能由当前激活输入法调用,因需令牌(token)验证。
参数
token
flags
public boolean hideSoftInputFromWindow (IBinder windowToken, int flags)
参数
windowToken 由窗口恳求View.getWindowToken()返回获得的令牌(token)。
flags
public boolean hideSoftInputFromWindow (IBinder windowToken, int flags, ResultReceiver resultReceiver)
从窗口高低文中断定当前接管输入的窗口,请求隐蔽其软键盘窗口。它可由用户调用并获得成果而不仅仅是显式请求输入法窗口隐蔽。
参数
windowToken 由窗口恳求View.getWindowToken()返回获得的令牌(token)。
flags
resultReceiver
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 setCurrentInputMethodSub
(译者注:此办法为3.0中新增的办法)
public void setInputMethod (IBinder token, String id)
强迫切换到新输入法部件。只能由持有token的应用法度(application)或办事(service)调用当前激活输入法。
token
id
public void setInputMethodAndSubtype
强迫切换到一个新的输入法和指定的类型。只能由持有token的应用法度(application)或办事(service)调用当前激活输入法。(译者注:此办法为3.0中新增的办法)
token
id
subtype 切换到新输入法的新类型。
public void showInputMethodAndSubtyp
(译者注:此办法为3.0中新增的办法)
public void showInputMethodPicker ()
(译者注:显示输入法菜单列表)
public boolean showSoftInput (View view, int flags, ResultReceiver resultReceiver)
如须要,显式请求当前输入法的软键盘区域向用户显示。当用户与视图交互,用户默示要开端履行输入操纵时,可以调用此办法。
view
flags
resultReceiver
public boolean showSoftInput (View view, int flags)
showSoftInput(View, int, ResultReceiver)的无返回值版:如须要,显式请求当前输入法的软键盘区域向用户显示。
view
flags
public void showSoftInputFromInputMe
显示输入法的软键盘区域,如许用户可以到看到输入法窗口并能与其交互。只能由当前激活输入法调用,因需令牌(token)验证。
token
flags
public void showStatusIcon (IBinder imeToken, String packageName, int iconId)
(译者注:显示状况栏图标?)
public boolean switchToLastInputMethod (IBinder imeToken)
public void toggleSoftInput (int showFlags, int hideFlags)
(译者注:切换软键盘)
public void toggleSoftInputFromWindo
本办法切换输入法的窗口显示。如输入窗口已显示,它隐蔽。如无输入窗口则显示。
windowToken
showFlags
hideFlags
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)
返回当前选择区域。