android 输入法界面显示的开关
16lz
2021-01-22
进入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
更多相关文章
- Android 待机功能流程分析
- Android自定义View流程
- Android系统启动流程 -- android
- Eclipse Java:根据构建配置定义最终变量
- Android短彩信源码解析-短信发送流程(三)
- 在string.xml中调用变量[重复]
- thinking in java逍遥游记 之 夜的第四章 - 控制执行流程
- Thrift项目Server端开发流程
- 增强的for循环中局部变量的范围