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

相关推荐
Lee川33 分钟前
Milvus 实战:当 RAG 遇上向量数据库,从"玩具 Demo"到"生产可用的"那一步
前端·数据库·人工智能
anOnion1 小时前
构建无障碍组件之Toolbar Pattern
前端·html·交互设计
惊鸿一博2 小时前
图标加载方式_zeroIcon_是否加前缀mdi
开发语言·前端·javascript
2501_940041742 小时前
前端工程化进阶:5个高交互与可视化项目提示词
前端
你很易烊千玺2 小时前
JS 异步 从零讲(大白话 + 真实场景 + 可运行案例)
前端·javascript·vue.js
独隅3 小时前
Android Studio 接入 CodeX 的全面指南
android·ide·android studio
why技术4 小时前
AI Coding开始进入第四个时代,我还没上车呢!
前端·人工智能·后端
大家的林语冰5 小时前
CSS 已死?DOM 性能黑洞!Pretext 排版革命让你在文本间跳舞,没有 DOM 也能纵享丝滑~
前端·javascript·css
vipbic5 小时前
我也该升级了,陪伴了我7年的博客
前端
Lee川5 小时前
RAG 实战:从一篇掘金文章出发,拆解检索增强生成的全链路
前端·人工智能·后端