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 是/曾在 TextViewEditText 的 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:singleLinesetSingleLine 还是对于 setTransformationMethod。相比之下,相同的 TextView 文档确实声明不推荐使用 STATUS_BAR_HIDDENfitSystemWindows 等其他内容。那么singleLine 弃用是一个遗漏,是“不弃用”还是什么?

这个问题是previously asked before,但不是问题的主要焦点(并且没有得到回答)。

【问题讨论】:

在哪些情况下 maxLines="1" 不起作用? 你可以为这两种情况发布code 块吗? 我并不是真的在这里问为什么maxLines="1" 的特定实例据称不起作用。 (可能它确实在每种情况下都有效。)我只想知道singleLine 是否真的被弃用了。话虽如此,我没有任何权威的例子,但请参阅this answer 和this Q&A 的ellipsize="marquee" 部分以及this answer with comments。 我遇到了 singleLine 属性的奇怪副作用 - 我在 ViewPager 中使用了 TextViews,如果我用手指滑过 @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.xmldiff 的更改中可以看出,添加了@deprecated doc 注释,但core/java/android/widget/TextView.java diff 并没有改变setSingleLine() 的doc 注释中的任何内容。

现在无法访问 Google 的内部 SCM 历史记录,无法知道究竟是什么导致了attrs.xml doc 评论中的上述变化,但对于您的问题

那么singleLine 弃用是一个遗漏,是“未弃用”还是什么?

一个可能的答案是:TextView 的单行既没有被弃用,也没有被“弃用”,但它被增强以考虑视图是否可编辑、密码字段或使用任何其他输入类型标志影响单线/多线。

【讨论】:

这里的几个答案提供了一些有用的讨论和洞察这个问题,但由于赏金时间快到了,我将它授予这个答案,因为它深入并吸引了最多来自可靠的官方消息来源。不过,我还没有准备好选择一个可接受的答案。【参考方案3】:

只是为了在讨论中添加更多信息,Lint 现在出现以下错误:

“结合ellipsizemaxLines=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 中是不是已弃用?的主要内容,如果未能解决你的问题,请参考以下文章

EditText属性的应用

Android布局属性详解

Android布局属性详解

Android布局属性详解

每日总结

android editText 监听事件