android - 自动调整 EditText

标签 android android-edittext autosize

Android 最近添加了对基于 View 大小以及最小和最大文本大小调整 TextViews 文本大小的支持。
https://developer.android.com/guide/topics/ui/look-and-feel/autosizing-textview.html

不幸的是,他们不支持 EditText,那么 EditText 是否还有其他替代方案?

最佳答案

我和你一样被困住了,为什么 EditText 是 TextView 的子级,但不支持自动调整大小 ¿?¿?

我已经通过某种 hack 实现了这一点。 首先,我在 EditTextView 上看到了要复制和实现为扩展(在 Kotlin 中)的 TextView 代码,但是......有很多方法,所以最终我放弃了那个选项。

我所做的是使用不可见的 TextView(是的,我知道这是一个完全的 hack,我对此不是很满意,但谷歌应该为此感到羞耻)

这是我的xml

    <TextView android:id="@+id/invisibleTextView"
    android:layout_height="0dp"
    android:layout_width="match_parent"
    android:focusable="false"
    app:autoSizeTextType="uniform"
    app:autoSizeMinTextSize="@dimen/text_min"
    app:autoSizeMaxTextSize="@dimen/text_max"
    app:autoSizeStepGranularity="@dimen/text_step"
    android:textAlignment="center"
    app:layout_constraintLeft_toLeftOf="@id/main"
    app:layout_constraintRight_toRightOf="@id/main"
    app:layout_constraintTop_toBottomOf="@id/textCount"
    app:layout_constraintBottom_toBottomOf="@id/main"
    android:visibility="invisible"
    tool:text="This is a Resizable Textview" />


<EditText android:id="@+id/resizableEditText"
    android:layout_height="0dp"
    android:layout_width="match_parent"
    android:textAlignment="center"
    app:layout_constraintLeft_toLeftOf="@id/main"
    app:layout_constraintRight_toRightOf="@id/main"
    app:layout_constraintTop_toBottomOf="@id/textCount"
    app:layout_constraintBottom_toBottomOf="@id/main"
    android:maxLength="@integer/max_text_length"
    tool:text="This is a Resizable EditTextView" />

注意:两个 View 具有相同的宽度/高度很重要

然后在我的代码中,我使用来自此 TextView 的自动计算用于我的 EditTextView。

private fun setupAutoresize() {
    invisibleTextView.setText("a", TextView.BufferType.EDITABLE) //calculate the right size for one character
    resizableEditText.textSize = autosizeText(invisibleTextView.textSize)
    resizableEditText.setHint(R.string.text_hint)

    resizableEditText.addTextChangedListener(object : TextWatcher {
        override fun afterTextChanged(editable: Editable?) {
            resizableEditText.textSize = autosizeText(invisibleTextView.textSize)
        }

        override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}

        override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
            textCount.text = currentCharacters.toString()
            val text = if (s?.isEmpty() ?: true) getString(R.string.text_hint) else s.toString()
            invisibleTextView.setText(text, TextView.BufferType.EDITABLE)
        }
    })
}

private fun autosizeText(size: Float): Float {
    return size / (resources.displayMetrics.density + MARGIN_FACTOR /*0.2f*/)
}

请注意,为了更改提示的大小,我使用了这个 Android EditText Hint Size .

我知道这是一个艰难的解决方法,但至少我们确信即使在未来版本中发生可调整大小的更改时它也会继续工作,而专有或废弃的 github 库将失败。

我希望有一天,谷歌能听到我们的声音,并在 children 身上实现这个美妙的功能,我们就可以避免所有这些事情

希望对你有帮助

关于android - 自动调整 EditText,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47053834/

相关文章:

android - Dialog 中 TextView 的可见性

android - 使用FFMPEG android用视频中的图像替换人脸

android - 顶部有背景图片的 RecyclerView

android - 带有 edittext 和 textwatcher 的 ListView 。 Textwatcher 触发多次(超过 3 次)

java - 如何通过 EditText 获取用户输入并对其进行处理

ios - 用于自动调整 UIView 大小的圆角

xml - Powershell自动使用新行

Android长按菜单按钮

android - 设备旋转后未设置 EditText

c# - 带有 AutoSize 的面板内的 FlowLayoutPanel 问题