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;
我们看下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;
}
}
从上面来看,它的确是传了个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的流程,可以看我写的另一个帖子:
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软键盘(1)---输入法界面管理(打开/关闭/状态获取)
- Eclipse无法显示Android设计界面解决方案
- 解决Android Graphical Layout 界面效果不显示
- 【Android界面实现】解决ScrollView中嵌套Listview,Listview中嵌套Listview显示不完整和滑动冲突的问题
- android应用程序第一次启动时显示引导界面
- Android仿微信添加照片并且随意限制照片数量并显示缩略图界面
- android 利用一条 adb命令行 秒速找到当前显示界面的Activity类名
- Android5.0(L)输入法表情界面㊗和㊙显示框框
- Android软键盘(六)如何监听到软件盘显示与隐藏的事件,完美实现登录界面
- Android输入法界面管理(打开/关闭/状态获取)
- 芝麻信用分SDK接入,显示芝麻信用授权界面(Android)
- 【android开发】解决输入法与表情面板切换时的界面抖动问题
- Android+PHP+MYSQL把数据库中的数据显示在Android界面上
- Android 输入法弹出框挡住界面问题
- Android界面设计(左侧隐藏菜单右边显示content)demo
- Android 中设置只是程序第一次运行才显示的界面
- Android图形显示系统——上层显示1:界面绘制大纲
- android启动activity文本框不打开输入法界面
- android 学习笔记3-debug调试 数据库 事务 显示界面TextView
- Android控件笔记——在界面中显示及输入文本信息