69

singleLineis/was 在 xml 布局文件中用于TextView以下EditText内容:

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:singleLine="true" />

SO上的一些人singleLine已弃用,而其他人仍然建议使用它。有时甚至似乎有必要在maxLines="1"不起作用时使用。(见这里这里这里

文档应该是回答这个问题的地方,对吧?在这里,他们说:

此常量在 API 级别 3 中已弃用。

此属性已弃用。改用maxLines更改静态文本的布局,并使用textMultiLineinputType 属性中的标志代替可编辑的文本视图(如果同时提供了 singleLine 和 inputType,则 inputType 标志将覆盖 singleLine 的值)。

但是,在 TextView 文档中,没有迹象表明它已被弃用,无论是 forandroid:singleLine还是 forsetSingleLine或 for setTransformationMethod。相比之下,相同的 TextView 文档确实声明了其他类似STATUS_BAR_HIDDENfitSystemWindows已弃用的内容。那么singleLine弃用是一个遗漏,是“不弃用”还是什么?

这个问题以前曾被问过,但不是问题的主要焦点(也没有回答)。

4

10 回答 10

49

我认为您的问题的答案已经在您链接到的 SO 帖子之一中。不幸的是,弃用 ofsingleLines并不是非黑即白的事情。

已被弃用,但它不会很快消失。

它被弃用是因为它的性能相对于它的继任者来说很差,maxLines. 它用于SingleLineTransformationMethod替换您放置在 中的字符串中的换行符和回车符TextView,与 不同的maxLines是,它“只是”根据行数调整 的高度,TextView并且不替换字符串。

这种替换字符的方法也意味着singleLine可能会以意想不到的方式中断(例如,如果您使用自定义字体)。正是这些性能和可靠性问题导致了它的弃用。

但是,它不会去任何地方,因为正如您链接到的 SO 帖子所述,许多旧的 Android 应用程序仍在使用它,并且有时它仍然有用(例如,当您想在一行上显示整个文本并忽略回车和换行符)。

请注意,弃用并不一定意味着 API 将要消失。它只是意味着不鼓励使用它,但可能会被允许。

于 2015-05-19T01:24:44.010 回答
21

已弃用的属性是在更改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文档评论的上述变化,但对于您的问题

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

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

于 2015-05-19T09:25:05.303 回答
10

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

“在某些设备上结合ellipsizemaxLines=1可能导致崩溃。早期版本的 lint 建议替换singleLine=true为,maxLines=1但在使用ellipsize.

更多信息:https ://issuetracker.google.com/issues/36950033 “

所以,我想singleLine就是现在,我认为我们应该想出一个新术语......“弃用”?

于 2017-10-13T08:02:05.327 回答
9

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 属性现已正式弃用。(从 API 3 开始?)。它现在在 AndroidStudio xml 编辑器中可见。

于 2015-05-13T15:48:47.163 回答
5

虽然 Android Studio 声称它已被弃用,但实际上我们有一个编辑文本,它应该只允许自己是单行的。

添加maxLines="1"使它允许换行符,这不适合我们的需要。

所以我们回到使用singleLine="true".

于 2016-11-21T09:23:55.323 回答
5

只是想我会添加 Android Studio 2.2.1 将 singleLine 标记为已弃用。但是,我发现在我的例子中:

android:singleLine="false"

运作良好,而

android:maxLines="2"

才不是。

于 2016-10-19T14:24:24.757 回答
5

singleLine已弃用。无需讨论。

唯一的问题是错误的文档。
“使用属性textMultiLine中的标志inputType而不是可编辑的文本视图”与您想要通过使用singleLine.

取而代之的是,您可以使用android:inputType="text".
对我来说,它完全符合我的要求 - 单行编辑,没有换行符。

于 2016-12-14T12:37:17.543 回答
5

我刚刚添加android:inputType="text"和删除android:maxLines="1",它对我来说很好。

于 2017-04-07T12:17:16.120 回答
1

只提供android:maxLines="1"并且android:minLines="1"不会解决键盘actionNext相关问题的问题。用于android:inputType="text"相同。

于 2018-01-08T11:53:05.557 回答
0

简单的替代方式,使用:android:maxLines="1"

于 2016-12-19T05:34:17.240 回答