我设法使用 InputConnectionWrapper 解决了这个问题,它有一个用于进入全屏模式的显式回调。
/**
* [InputConnection] wrapper which applies hint text to
* the IME when entering fullscreen mode.
*/
class FullscreenHintInputConnection(
delegate: InputConnection,
private val editText: EditText,
private val hintText: CharSequence
) : InputConnectionWrapper(delegate, false) {
override fun reportFullscreenMode(enabled: Boolean): Boolean {
if (enabled) {
editText.hint = hintText
} else {
editText.hint = null
}
return super.reportFullscreenMode(enabled)
}
}
在 EditText 子类中:
override fun onCreateInputConnection(outAttrs: EditorInfo): InputConnection {
val connection = super.onCreateInputConnection(outAttrs)
return FullscreenHintInputConnection(connection, this, "Lorem ipsum")
}
虽然这个解决方案有效,但值得注意的是 AppCompat 设法更优雅地做到这一点。该库修改了传入的 EditorInfo 参数onCreateInputConnection
,完全避免了 InputConnectionWrapper 子类。
AppCompatEditText.java https://github.com/aosp-mirror/platform_frameworks_support/blob/da976e5cb8b03b3400768cb5da19025f41836b93/appcompat/src/main/java/androidx/appcompat/widget/AppCompatEditText.java#L190-L194
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
return AppCompatHintHelper.onCreateInputConnection(
super.onCreateInputConnection(outAttrs),
outAttrs,
this
);
}
AppCompatHintHelper.java https://github.com/aosp-mirror/platform_frameworks_support/blob/da976e5cb8b03b3400768cb5da19025f41836b93/appcompat/src/main/java/androidx/appcompat/widget/AppCompatHintHelper.java
class AppCompatHintHelper {
static InputConnection onCreateInputConnection(InputConnection ic, EditorInfo outAttrs,
View view) {
if (ic != null && outAttrs.hintText == null) {
ViewParent parent = view.getParent();
while (parent instanceof View) {
if (parent instanceof WithHint) {
outAttrs.hintText = ((WithHint) parent).getHint();
break;
}
parent = parent.getParent();
}
}
return ic;
}
}
这用于将从 TextInputLayout 提供的提示应用于底层 TextInputEditText。其中一些 API 仅限于库,因此您需要将它们复制到您自己的项目中。但不幸的是,到目前为止,这项技术对我不起作用,提示仍然是空白的。