仅在 Extract UI 模式下显示 android:hint

2024-04-18

我有一个 android 布局中的 EditTexts 列表。每一个都标有一个 TextView,因此在纵向模式下不需要提示,甚至提示是多余的。但是,在横向模式下,许多人将键盘配置为全屏显示并隐藏应用程序,直到隐藏键盘并将输入注入到所选视图中:

如果您有一个用于输入的 EditText 字段,这可能没问题,但如果您有一个列表,则在浏览输入之前没有人会记住六个 TextView 标签。

如何设置仅在键盘处于提取 ui 模式时才出现的提示 - 无论是横向还是纵向?


我设法使用 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 仅限于库,因此您需要将它们复制到您自己的项目中。但不幸的是,到目前为止,这项技术对我不起作用,提示仍然是空白的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

仅在 Extract UI 模式下显示 android:hint 的相关文章

随机推荐