【问题标题】: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_width="wrap_content"
    android:layout_height="wrap_content"
    android:singleLine="true" />

Some people 在 SO 上说 singleLine 已弃用,而 other people 仍然建议使用它。有时,当maxLines="1" 不起作用时,它甚至似乎有必要使用。 (见hereherehere

文档应该是回答这个问题的地方,对吧? 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 answerthis Q&Aellipsize="marquee" 部分以及this answer with comments
  • 我遇到了 singleLine 属性的奇怪副作用 - 我在 ViewPager 中使用了 TextViews,如果我用手指滑过 @987654355,寻呼机没有响应触摸滑动事件@s。但是当我将该属性更改为 maxLines=1 时,一切正常!
  • @JafarKhQ 在某些情况下它表现不佳,尤其是在椭圆化时。

标签: android android-edittext attributes textview android-singleline


【解决方案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"

          【讨论】:

            猜你喜欢
            • 2017-02-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-12-11
            • 2018-05-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多