您的位置:首页 > 移动开发 > Android开发

android 输入法界面显示的开关

2014-04-25 15:14 232 查看
进入InputMethodManager类的doStartInput方法

void doStartInput(InputConnection ic, EditorInfo attribute, boolean restarting) {
if (!restarting) {
doFinishInput();
}
mInputStarted = true;
mStartedInputConnection = ic;
mInputEditorInfo = attribute;
initialize();
if (DEBUG) Log.v(TAG,"InputMethodService class" + "CALL: onStartInput , mWindowVisible=" + mWindowVisible);
onStartInput(attribute, restarting);
if (mWindowVisible) {
if (mShowInputRequested) {
if (DEBUG) Log.v(TAG,"InputMethodService class" + "CALL: onStartInputView");
mInputViewStarted = true;
onStartInputView(mInputEditorInfo, restarting);
startExtractingText(true);
} else if (mCandidatesVisibility == View.VISIBLE) {
if (DEBUG) Log.v(TAG,"InputMethodService class" + "CALL: onStartCandidatesView");
mCandidatesViewStarted = true;
onStartCandidatesView(mInputEditorInfo, restarting);
}
}
}

从上面来看mWindowVisible这个变量就是开关,那么我们来看下,这个变量是什么时候true的呢?即上面时候才让它show的呢?
找到两处赋值的地方,如下:

void showWindowInner(boolean showInput) {
boolean doShowInput = false;
boolean wasVisible = mWindowVisible;
mWindowVisible = true;
public void hideWindow() {
finishViews();
mImm.setImeWindowStatus(mToken, 0, mBackDisposition);
if (mWindowVisible) {
mWindow.hide();
mWindowVisible = false;
onWindowHidden();
mWindowWasVisible = false;
}
}


我们看下showWindowInner在什么地方被调用
public void showWindow(boolean showInput) {
if (DEBUG) Log.v(TAG,"InputMethodService class" + "Showing window: showInput=" + showInput
+ " mShowInputRequested=" + mShowInputRequested
+ " mWindowAdded=" + mWindowAdded
+ " mWindowCreated=" + mWindowCreated
+ " mWindowVisible=" + mWindowVisible
+ " mInputStarted=" + mInputStarted);

if (mInShowWindow) {
Log.w(TAG,"InputMethodService class" + "Re-entrance in to showWindow");
return;
}

try {
mWindowWasVisible = mWindowVisible;
mInShowWindow = true;
showWindowInner(showInput);
} finally {
mWindowWasVisible = true;
mInShowWindow = false;
}
}
public void showSoftInput(int flags, ResultReceiver resultReceiver) {
if (DEBUG) Log.v(TAG,"InputMethodService class" +  "showSoftInput()");
boolean wasVis = isInputViewShown();
mShowInputFlags = 0;
if (onShowInputRequested(flags, false)) {
if (DEBUG) Log.v(TAG,"InputMethodService class" +  "showWindow(true)");
showWindow(true);
}


从上面来看,它的确是传了个true,showWindow(true);那么什么时候才周到这里呢?看了下日志,如下:
01-01 09:22:22.520 V/PateoInputMethod( 1486): InputMethodService classshowSoftInput()

01-01 09:22:22.520 V/PateoInputMethod( 1486): InputMethodService classshowWindow(true)

可以看出是在show的时候进入该方法的,那就对了,好吧,有关怎么show的流程,可以看我写的另一个帖子:

 


android 点击输入框调出输入法流程分析


http://blog.csdn.net/jianguo_liao19840726/article/details/24413043

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: