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 方式被忽略的原因可能是什么?我也试过&#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 代码的主要内容,如果未能解决你的问题,请参考以下文章