android - 设置椭圆大小时,Android TextView lineCount 不返回正确的值
问题描述
我想展开和折叠我的 TextView。所以我为此做了这些扩展函数。
private const val MAX_LINES_PROPERTY_NAME = "maxLines"
private const val EXPAND_ANIMATION_DURATION = 200L
fun TextView.expand() {
val animation = ObjectAnimator.ofInt(this, MAX_LINES_PROPERTY_NAME, this.lineCount)
animation.setDuration(EXPAND_ANIMATION_DURATION).start()
}
fun TextView.collapse(numLines: Int) {
val animation = ObjectAnimator.ofInt(this, MAX_LINES_PROPERTY_NAME, numLines)
animation.setDuration(EXPAND_ANIMATION_DURATION).start()
}
当我像这样设置 TextView 时出现问题
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxLines="3"
android:ellipsize="end"
android:text="Long text"
android:textColor="@color/black"
android:textSize="16sp">
显然,当 ellipsize 设置为“end”时,textView.lineCount 返回 3。当我删除那行代码时,一切正常。有谁知道我该如何避免这种情况?
解决方案
我找到了一些设置 ellipsize 并获取整个 TextView 的 lineCount 的 hacky 方法。
首先,我删除android:ellipsize="end"
了 xml 中的行。
之后,我在本地保存了 lineCount,然后我以编程方式设置了 ellipsize。
private var textLineCount = 0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
textView.post {
textLineCount = textView.lineCount
textView.ellipsize = TextUtils.TruncateAt.END
}
}
现在我在本地有了 textLineCount,我只是将它传递到我的函数中以扩展我这样修改的 TextView
fun TextView.expand(maxLines: Int? = null) {
val animation = ObjectAnimator.ofInt(this, MAX_LINES_PROPERTY_NAME, maxLines ?: this.lineCount)
animation.setDuration(EXPAND_ANIMATION_DURATION).start()
}
就是这样。我知道这不是最快乐的解决方案,但它确实有效。如果有人知道更好,请分享您的解决方案。
推荐阅读
- javascript - 如何获取 React 组件的状态以实现全局保存按钮
- amazon-web-services - elastic beanstalk 无法读取密钥管理系统密钥
- c - 占位符问题
- vue.js - 将 Shopify AppBridge 实例传递给各种 Nuxt / Vue 组件
- javascript - 如何通过ID从数据库中获取对象
- python - Pandas:将列切片聚合为数组
- intellij-idea - 使用 maven 构建时 Intellij 关闭
- css - 创意 CSS 解决方案。突出显示所有元素
- asp.net-core-mvc - 验证用户时如何验证任意条件?
- c++ - C ++中的Docker线程池端口问题