XML 中按钮的换行符不受尊重,但它适用于 Java 代码

Posted

技术标签:

【中文标题】XML 中按钮的换行符不受尊重,但它适用于 Java 代码【英文标题】:Newline for button in XML not respected but it does with Java code 【发布时间】:2019-01-29 11:51:44 【问题描述】:

我有一个带有长文本的按钮,我想将它分成两行,以使按钮的宽度与其他按钮的大小相同。

问题是,当我通过 XML 代码执行此操作时,AVD 和我的硬件设备都会忽略换行符(但在编辑器预览中正确显示)。当我使用 Java 代码时,它受到尊重。

这被忽略了:

<Button
    android:id="@+id/button"
    android:layout_columnWeight="1"
    android:layout_gravity="fill"
    android:layout_rowWeight="1"
    android:onClick="playSpeech"
    android:tag="doyouspeakenglish"
    android:text="Do you\nspeak English?" />

这会正确应用换行符:

((Button) findViewById(R.id.button)).setText("Do you\nspeak English?");

XML 方式被忽略的原因可能是什么?我也试过&amp;#10;,这里建议:how can I display multiple lines of text on a button。同样,没有成功。

完整的布局代码

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    tools:context=".MainActivity">

    <GridLayout
        android:layout_
        android:layout_
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:columnCount="2"
        android:rowCount="4"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <Button
            android:id="@+id/button"
            android:layout_columnWeight="1"
            android:layout_gravity="fill"
            android:layout_rowWeight="1"
            android:onClick="playSpeech"
            android:tag="doyouspeakenglish"
            android:text="Do you\nspeak English?" />

        <Button
            android:id="@+id/button2"
            android:layout_columnWeight="1"
            android:layout_gravity="fill"
            android:layout_rowWeight="1"
            android:onClick="playSpeech"
            android:tag="goodevening"
            android:text="Good Evening" />

        <Button
            android:id="@+id/button3"
            android:layout_columnWeight="1"
            android:layout_gravity="fill"
            android:layout_rowWeight="1"
            android:onClick="playSpeech"
            android:tag="hello"
            android:text="Hello" />

        <Button
            android:id="@+id/button4"
            android:layout_columnWeight="1"
            android:layout_gravity="fill"
            android:layout_rowWeight="1"
            android:onClick="playSpeech"
            android:tag="howareyou"
            android:text="How are you?" />

        <Button
            android:id="@+id/button5"
            android:layout_columnWeight="1"
            android:layout_gravity="fill"
            android:layout_rowWeight="1"
            android:onClick="playSpeech"
            android:tag="ilivein"
            android:text="I live in..." />

        <Button
            android:id="@+id/button6"
            android:layout_columnWeight="1"
            android:layout_gravity="fill"
            android:layout_rowWeight="1"
            android:onClick="playSpeech"
            android:tag="mynameis"
            android:text="My name is..." />

        <Button
            android:id="@+id/button7"
            android:layout_columnWeight="1"
            android:layout_gravity="fill"
            android:layout_rowWeight="1"
            android:onClick="playSpeech"
            android:tag="please"
            android:text="Please" />

        <Button
            android:id="@+id/button8"
            android:layout_columnWeight="1"
            android:layout_gravity="fill"
            android:layout_rowWeight="1"
            android:onClick="playSpeech"
            android:tag="welcome"
            android:text="Welcome" />
    </GridLayout>
</android.support.constraint.ConstraintLayout>

其他细节: 使用 Android Studio 3.1.4 和 SDK v26

请注意,此问题与How do I add a newline to a TextView in Android? 不同,因为针对textview 的建议解决方案不适用于我的button 案例。

【问题讨论】:

试试这个android:text="Do you \r\n speak English?"让你检查这个答案***.com/a/23721628/7666442查看输出screenshot image @NileshRathod 是的,我也尝试过,但它不起作用。另外,请注意,您链接到的屏幕截图是编辑器中预览的屏幕截图。在我的编辑器中它也显示正确,但在模拟器和我的手机上却没有。 对我来说 android:text="Do you \n speak English?"android:text="Do you \r\n speak English?" 在真实设备检查屏幕截图中工作正常 image screen shot @NileshRathod 你能给我提供你的整个 XML 代码吗?所以我可以比较一下是不是语法问题 检查我下面的布局 【参考方案1】:

试试这个

      <LinearLayout
          android:layout_
          android:layout_
          android:orientation="vertical">
          <Button
              android:id="@+id/button"
              android:layout_
              android:layout_
              android:onClick="playSpeech"
              android:tag="doyouspeakenglish"
              android:maxLines="2"
              android:text="Do you \n speak English?" />
          <Button
              android:layout_
              android:layout_
              android:onClick="playSpeech"
              android:tag="doyouspeakenglish"
              android:maxLines="2"
              android:text="Do you \n speak English?" />

          <Button
              android:layout_
              android:layout_
              android:onClick="playSpeech"
              android:tag="doyouspeakenglish"
              android:maxLines="2"
              android:text="Do you \n speak English?" />

      </LinearLayout>

【讨论】:

奇怪的事情正在发生......我用你的按钮替换了我的按钮(我没有复制 LinearLayout),但我的按钮布局总是显示在模拟器中。我多次清理、重建和无效/重新启动缓存,但没有任何改变。但是,如果我查看您的代码,这正是我之前尝试过的,除了 LinearLayout,因为这不是我现在想要的。 @EarthMind 也 Strange 你的代码在我的设备中工作找到 i.stack.imgur.com/qzm8X.png 正如我在所有这些搜索之后所怀疑的那样,问题出在其他地方。幸运的是不是一个损坏的安装,而只是一个一直在使用的不同的邮件布局。我之前偶然创建了一个额外的 activity_main.xml (v21),其中包含旧代码。这就是为什么忽略换行并且您的 XML 代码也没有应用的原因。我很高兴现在一切都结束了:-)【参考方案2】:

这是一个我不知道的问题,因为我总是使用字符串资源。 此外,问题仅存在于设计中。在模拟器中,我可以看到换行符。 无论如何,在strings.xml 中添加这一行:

<string name="mytext">Do you\nspeak English?</string>

并设置按钮的文本:

android:text="@string/mytext" 

\n 这样工作。

【讨论】:

不幸的是,这并没有解决它。仍然只有 Java 代码有效。 @EarthMind 似乎我们面临不同的问题,因为在我的情况下,换行符在模拟器/设备中有效,但在预览中无效 如您所料,问题出在其他地方。如果您有兴趣,请查看我对 Nilesh 的最后评论。 @EarthMind 很高兴您的问题得到解决。我的不是,但正如我提到的,我总是使用资源(我相信这是最佳实践)所以没有问题。 没错,这是推荐的做法。就我而言,我使用硬编码字符串,因为它是一个非常简单的训练应用程序,没有其他用途【参考方案3】:

正如我在所有这些搜索之后所怀疑的那样,问题出在代码之外的其他地方。幸运的是不是损坏的安装,而只是一个不同的主布局,一直在模拟器或我的手机中用作默认设置。

我之前偶然创建了一个额外的activity_main.xml (v21),其中包含旧代码。这就是我对真实activity_main.xml 的更新被忽略的原因。

【讨论】:

以上是关于XML 中按钮的换行符不受尊重,但它适用于 Java 代码的主要内容,如果未能解决你的问题,请参考以下文章

完全尊重空白和换行符的资源字符串

换行换行符不适用于 UILabel 仅适用于特定文本字符串

UIView clipsToBounds不起作用

hl.fragsize 在我的查询中不受尊重

UIButton 的 backgroundImage 的内容模式不受尊重

VS2019 .editorconfig 不受尊重