Window 的 Type 失效了?IME 为什么在 Toast 下方?

看起来,输入法的层级是比 Toast 要高的,为什么显示的时候,toast 在 ime 上方?

可以看到 ime 最终挂载到 Activity 下方

在 wms 的 addWindow 中可能对 ime 的位置进行移动。imMayMove 为 true 时就可以调用 displayContent 进行移动。

java 复制代码
boolean imMayMove = true;

win.mToken.addWindow(win);
displayPolicy.addWindowLw(win, attrs);
displayPolicy.setDropInputModePolicy(win, win.mAttrs);
if (type == TYPE_APPLICATION_STARTING && activity != null) {
	activity.attachStartingWindow(win);
	ProtoLog.v(WM_DEBUG_STARTING_WINDOW, "addWindow: %s startingWindow=%s",
			activity, win);
} else if (type == TYPE_INPUT_METHOD
		// IME window is always touchable.
		// Ignore non-touchable windows e.g. Stylus InkWindow.java.
		&& (win.getAttrs().flags & FLAG_NOT_TOUCHABLE) == 0) {
	displayContent.setInputMethodWindowLocked(win);
	imMayMove = false;
} else if (type == TYPE_INPUT_METHOD_DIALOG) {
	displayContent.computeImeTarget(true /* updateImeTarget */);
	imMayMove = false;
} else {
	if (type == TYPE_WALLPAPER) {
		displayContent.mWallpaperController.clearLastWallpaperTimeoutTime();
		displayContent.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER;
	} else if (win.hasWallpaper()) {
		displayContent.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER;
	} else if (displayContent.mWallpaperController.isBelowWallpaperTarget(win)) {
		// If there is currently a wallpaper being shown, and
		// the base layer of the new window is below the current
		// layer of the target window, then adjust the wallpaper.
		// This is to avoid a new window being placed between the
		// wallpaper and its target.
		displayContent.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER;
	}
}

final WindowStateAnimator winAnimator = win.mWinAnimator;
winAnimator.mEnterAnimationPending = true;
winAnimator.mEnteringAnimation = true;
// Check if we need to prepare a transition for replacing window first.
if (!win.mTransitionController.isShellTransitionsEnabled()
		&& activity != null && activity.isVisible()
		&& !prepareWindowReplacementTransition(activity)) {
	// If not, check if need to set up a dummy transition during display freeze
	// so that the unfreeze wait for the apps to draw. This might be needed if
	// the app is relaunching.
	prepareNoneTransitionForRelaunching(activity);
}

if (displayPolicy.areSystemBarsForcedConsumedLw()) {
	res |= WindowManagerGlobal.ADD_FLAG_ALWAYS_CONSUME_SYSTEM_BARS;
}

if (mInTouchMode) {
	res |= WindowManagerGlobal.ADD_FLAG_IN_TOUCH_MODE;
}
if (win.mActivityRecord == null || win.mActivityRecord.isClientVisible()) {
	res |= WindowManagerGlobal.ADD_FLAG_APP_VISIBLE;
}

displayContent.getInputMonitor().setUpdateInputWindowsNeededLw();

boolean focusChanged = false;
if (win.canReceiveKeys()) {
	focusChanged = updateFocusedWindowLocked(UPDATE_FOCUS_WILL_ASSIGN_LAYERS,
			false /*updateInputWindows*/);
	if (focusChanged) {
		imMayMove = false;
	}
}

if (imMayMove) {
	displayContent.computeImeTarget(true /* updateImeTarget */);
}

com.android.server.wm.DisplayContent#computeImeTarget

相关推荐
自由鬼2 小时前
如何处理Y2K38问题
java·运维·服务器·程序人生·安全·操作系统
奕辰杰3 小时前
关于npm前端项目编译时栈溢出 Maximum call stack size exceeded的处理方案
前端·npm·node.js
JiaLin_Denny4 小时前
如何在NPM上发布自己的React组件(包)
前端·react.js·npm·npm包·npm发布组件·npm发布包
路光.5 小时前
触发事件,按钮loading状态,封装hooks
前端·typescript·vue3hooks
我爱996!5 小时前
SpringMVC——响应
java·服务器·前端
咔咔一顿操作6 小时前
Vue 3 入门教程7 - 状态管理工具 Pinia
前端·javascript·vue.js·vue3
kk爱闹6 小时前
用el-table实现的可编辑的动态表格组件
前端·vue.js
漂流瓶jz7 小时前
JavaScript语法树简介:AST/CST/词法/语法分析/ESTree/生成工具
前端·javascript·编译原理
换日线°7 小时前
css 不错的按钮动画
前端·css·微信小程序
风象南7 小时前
前端渲染三国杀:SSR、SPA、SSG
前端