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

相关推荐
东东51614 分钟前
智能社区管理系统的设计与实现ssm+vue
前端·javascript·vue.js·毕业设计·毕设
catino18 分钟前
图片、文件的预览
前端·javascript
layman05282 小时前
webpack5 css-loader:从基础到原理
前端·css·webpack
半桔2 小时前
【前端小站】CSS 样式美学:从基础语法到界面精筑的实战宝典
前端·css·html
AI老李2 小时前
PostCSS完全指南:功能/配置/插件/SourceMap/AST/插件开发/自定义语法
前端·javascript·postcss
_OP_CHEN2 小时前
【前端开发之CSS】(一)初识 CSS:网页化妆术的终极指南,新手也能轻松拿捏页面美化!
前端·css·html·网页开发·样式表·界面美化
啊哈一半醒2 小时前
CSS 主流布局
前端·css·css布局·标准流 浮动 定位·flex grid 响应式布局
JMchen1232 小时前
现代Android图像处理管道:从CameraX到OpenGL的60fps实时滤镜架构
android·图像处理·架构·kotlin·android studio·opengl·camerax
PHP武器库2 小时前
ULUI:不止于按钮和菜单,一个专注于“业务组件”的纯 CSS 框架
前端·css
电商API_180079052473 小时前
第三方淘宝商品详情 API 全维度调用指南:从技术对接到生产落地
java·大数据·前端·数据库·人工智能·网络爬虫