xml 属性 singleLine 在 Android 中是不是已弃用?
Posted
技术标签:
【中文标题】xml 属性 singleLine 在 Android 中是不是已弃用?【英文标题】:Is the xml attribute singleLine deprecated or not in Android?xml 属性 singleLine 在 Android 中是否已弃用? 【发布时间】:2015-07-13 18:06:03 【问题描述】:singleLine
是/曾在 TextView
和 EditText
的 xml 布局文件中使用,如下所示:
<TextView
android:layout_
android:layout_
android:singleLine="true" />
Some people 在 SO 上说 singleLine
已弃用,而 other people 仍然建议使用它。有时,当maxLines="1"
不起作用时,它甚至似乎有必要使用。 (见here、here和here)
文档应该是回答这个问题的地方,对吧? Here, they say:
此常量在 API 级别 3 中已弃用。
这个属性是 已弃用。改用
maxLines
来更改静态的布局 文本,并在 inputType 属性中使用textMultiLine
标志 代替可编辑的文本视图(如果 singleLine 和 inputType 都是 提供时,inputType 标志将覆盖 singleLine 的值)。
但是,in the TextView docs,没有迹象表明它已被弃用,无论是对于 android:singleLine
、setSingleLine
还是对于 setTransformationMethod
。相比之下,相同的 TextView 文档确实声明不推荐使用 STATUS_BAR_HIDDEN
和 fitSystemWindows
等其他内容。那么singleLine
弃用是一个遗漏,是“不弃用”还是什么?
这个问题是previously asked before,但不是问题的主要焦点(并且没有得到回答)。
【问题讨论】:
在哪些情况下 maxLines="1" 不起作用? 你可以为这两种情况发布code
块吗?
我并不是真的在这里问为什么maxLines="1"
的特定实例据称不起作用。 (可能它确实在每种情况下都有效。)我只想知道singleLine
是否真的被弃用了。话虽如此,我没有任何权威的例子,但请参阅this answer 和this Q&A 的ellipsize="marquee"
部分以及this answer with comments。
我遇到了 singleLine 属性的奇怪副作用 - 我在 ViewPager
中使用了 TextView
s,如果我用手指滑过 @987654355,寻呼机没有响应触摸滑动事件@s。但是当我将该属性更改为 maxLines=1 时,一切正常!
@JafarKhQ 在某些情况下它表现不佳,尤其是在椭圆化时。
【参考方案1】:
我认为您的问题的答案已经在 SO posts you linked to 之一中。不幸的是,弃用singleLines
并非非黑即白。
它已被弃用,但它不会很快就会去任何地方。
它已被弃用,因为相对于它的继任者maxLines
,它的性能很差。它使用SingleLineTransformationMethod
替换您放置在TextView
中的字符串中的换行符和回车符,这与maxLines
不同,后者“只是”根据行数调整TextView
的高度,并且不进行字符串替换.
这种替换字符的方法也意味着singleLine
可以break in unexpected ways(例如,如果您使用自定义字体)。正是这些性能和可靠性问题导致了它的弃用。
但是,它不会去任何地方,因为,正如您链接到的 SO 帖子所说,它仍然被许多旧的 Android 应用程序使用,并且它仍然是有时很有用(例如,当您想在一行上显示整个文本并忽略回车符和换行符时)。
请注意,弃用并不一定意味着 API 即将消失。这只是意味着不鼓励使用它,但可能会被允许。
【讨论】:
如果它实际上已被弃用,那么在整个文档中标记它不是官方的做法吗?然而 TextView 文档并没有这样做。这就是让我怀疑这是疏忽还是故意含糊不清或其他原因的原因。 @Suragch 是的,这可能是一个疏忽(它不会是 Android 文档中的第一个疏忽)。请记住,它在 Android 开发的早期就被弃用了。事实上,弃用它的 git commit 是 Github 导入 Android 源代码中的第一个,日期为 2009 年 4 月。它在开发的早期就被弃用了,但并非所有文档都已更新。 我不确定为什么文档会推荐使用maxLines
。它不提供与singleLine
相同的行为。【参考方案2】:
不推荐使用的属性是在更改 d24b8183b9 中添加的,这不过是 Google 内部 SCM 的转储:
从 //branches/cupcake/...@130745 自动导入
从core/res/res/values/attrs.xml
diff 的更改中可以看出,添加了@deprecated doc 注释,但core/java/android/widget/TextView.java
diff 并没有改变setSingleLine()
的doc 注释中的任何内容。
现在无法访问 Google 的内部 SCM 历史记录,无法知道究竟是什么导致了attrs.xml
doc 评论中的上述变化,但对于您的问题
那么
singleLine
弃用是一个遗漏,是“未弃用”还是什么?
一个可能的答案是:TextView
的单行既没有被弃用,也没有被“弃用”,但它被增强以考虑视图是否可编辑、密码字段或使用任何其他输入类型标志影响单线/多线。
【讨论】:
这里的几个答案提供了一些有用的讨论和洞察这个问题,但由于赏金时间快到了,我将它授予这个答案,因为它深入并吸引了最多来自可靠的官方消息来源。不过,我还没有准备好选择一个可接受的答案。【参考方案3】:只是为了在讨论中添加更多信息,Lint 现在出现以下错误:
“结合ellipsize
和maxLines=1
可能会导致某些设备崩溃。早期版本的lint 建议将singleLine=true
替换为maxLines=1
,但在使用ellipsize
时不应这样做。
更多信息:https://issuetracker.google.com/issues/36950033"
所以,我猜singleLine
是现在,我认为我们应该想出一个新术语......“弃用”?
【讨论】:
此评论已有 4 年历史。四年前,这是“过时的”且不清楚的,现在仍然存在。这是精神错乱。【参考方案4】:在TextView
(v5.1.0 r1)的官方grepcode中:
android:singleLine
没有用@Deprecated
注释。
我在setInputType
方法中也看到了这一点:
boolean singleLine = !isMultilineInputType(type);
// We need to update the single line mode if it has changed or we
// were previously in password mode.
if (mSingleLine != singleLine || forceUpdate)
// Change single line mode, but only change the transformation if
// we are not in password mode.
applySingleLine(singleLine, !isPassword, true);
setInputType
会覆盖 mSingleLine
值所以。
编辑: 此 xml 属性现已正式弃用。 (since API 3?)。它现在在 AndroidStudio xml 编辑器中可见。
【讨论】:
【参考方案5】:只是想我会添加 Android Studio 2.2.1 将 singleLine 标记为已弃用。 但是,我发现在我的例子中:
android:singleLine="false"
效果很好,而
android:maxLines="2"
没有。
【讨论】:
【参考方案6】:虽然 Android Studio 声称它已被弃用,但实际上我们有一个编辑文本,它应该只允许自己是单行的。
添加maxLines="1"
使其允许换行符,这不适合我们的需要。
所以我们又回到使用singleLine="true"
。
【讨论】:
【参考方案7】:singleLine
已弃用。无需讨论。
唯一的问题是错误的文档。“使用inputType
属性中的textMultiLine
标志而不是可编辑的文本视图”与您想要通过使用singleLine
实现的目标完全相反。
您可以使用 android:inputType="text"
代替它。 对我来说,它完全符合我的要求 - 单行编辑,没有换行符。
【讨论】:
OP 描述了为什么需要讨论。声明“不需要讨论”而不引用可靠的消息来源说明问题已关闭的原因是没有帮助的。【参考方案8】:我刚刚添加了android:inputType="text"
并删除了android:maxLines="1"
,对我来说效果很好。
【讨论】:
我删除了 singleLine 属性,我做了你的回答,恭喜它对我有用!【参考方案9】:仅提供android:maxLines="1"
和android:minLines="1"
无法解决键盘问题actionNext
相关问题。同样使用android:inputType="text"
。
【讨论】:
【参考方案10】:简单的替代方式,使用:android:maxLines="1"
【讨论】:
以上是关于xml 属性 singleLine 在 Android 中是不是已弃用?的主要内容,如果未能解决你的问题,请参考以下文章