gpt4 book ai didi

android - 自动调整 EditText

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:45:28 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com