Новая строка для кнопки в XML не соблюдается, но имеет место с кодом Java

У меня есть кнопка с длинным текстом, который я хотел бы растянуть на две строки, чтобы ширина кнопки была того же размера, что и другие.

Проблема в том, что когда я делаю это с помощью кода 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;, как предлагается здесь: как я могу отобразить несколько строк текста на кнопке. Опять безуспешно.

Полный код макета

<?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_width = "match_parent"
    android:layout_height = "match_parent"
    tools:context = ".MainActivity">

    <GridLayout
        android:layout_width = "368dp"
        android:layout_height = "495dp"
        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

Обратите внимание, что этот вопрос не совпадает с Как добавить новую строку в TextView в Android?, потому что предлагаемые решения для textview не работают для моего корпуса button.

Попробуйте это android:text = "Do you \r\n speak English?", попросите вас проверить этот ответ stackoverflow.com/a/23721628/7666442 Посмотреть результат снимок экрана

AskNilesh 23.08.2018 09:51

@NileshRathod Да, я тоже пробовал, но не работает. Также обратите внимание, что связанный с вами снимок экрана - это скриншоты предварительного просмотра в редакторе. В моем редакторе это тоже отображается правильно, но в эмуляторе и на моих телефонах - нет.

EarthMind 23.08.2018 11:47

Для меня android:text = "Do you \n speak English?" и android:text = "Do you \r\n speak English?" работают нормально на реальном устройстве проверьте скриншот снимок экрана изображения

AskNilesh 23.08.2018 11:54

@NileshRathod Не могли бы вы предоставить мне весь свой XML-код, пожалуйста? Поэтому я могу сравнить, чтобы увидеть, проблема в синтаксисе

EarthMind 23.08.2018 12:07

проверьте мой макет ниже

AskNilesh 23.08.2018 12:38
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
5
228
3

Ответы 3

Попробуй это

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

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

      </LinearLayout>

Происходят странные вещи ... Я заменил свои кнопки на ваши (я не копировал LinearLayout), но мой макет кнопок всегда отображается в эмуляторе. Я очищал, перестраивал и аннулировал / перезапускал кеши несколько раз, но ничего не изменилось. Но если я посмотрю на ваш код, это именно то, что я пробовал раньше, за исключением LinearLayout, потому что сейчас я не хочу этого.

EarthMind 23.08.2018 13:11

@EarthMind также Strange, ваш код работает, найдите в моем устройстве i.stack.imgur.com/qzm8X.png

AskNilesh 23.08.2018 13:14

Как я и подозревал после всех этих поисков, проблема заключалась в другом. К счастью, это не коррумпированная установка, а просто постоянно использовавшаяся другая структура почты. У меня был дополнительный файл activity_main.xml (v21), который я создал случайно раньше, он содержал более старый код. Вот почему новая строка была проигнорирована, и ваш XML-код также не применялся. Я рада, что теперь все кончено :-)

EarthMind 23.08.2018 14:18

Это проблема, о которой я не знал, потому что я всегда использую строковые ресурсы.
И проблема существует только в дизайне. В эмуляторе я вижу разрыв строки.
В любом случае добавьте эту строку в strings.xml:

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

и установите текст кнопки:

android:text = "@string/mytext" 

Так работает \n.

К сожалению, это не решает проблему. По-прежнему работает только код Java.

EarthMind 23.08.2018 13:20

@EarthMind кажется, что мы сталкиваемся с разными проблемами, поскольку в моем случае разрыв строки работает в эмуляторе / устройстве, но не в предварительном просмотре

user8959091 23.08.2018 13:26

Как вы и предполагали, проблема заключалась в другом. Если вам интересно, посмотрите мой последний комментарий к Нилешу.

EarthMind 23.08.2018 14:19

@EarthMind Я рад, что твоя проблема решена. У меня нет, но, как я уже упоминал, я всегда использую ресурсы (я считаю, что это лучшая практика), поэтому проблем нет.

user8959091 23.08.2018 14:25

Верно, это рекомендуемая практика. В моем случае я использую жестко запрограммированные строки, потому что это очень простое приложение для обучения и не служит для других целей.

EarthMind 23.08.2018 18:25

Как я и подозревал после всех этих поисков, проблема заключалась не в коде. К счастью, это не поврежденная установка, а просто другой основной макет, который все время использовался по умолчанию в эмуляторе или на моих телефонах.

У меня был дополнительный activity_main.xml (v21), который я создал случайно раньше, и он содержал более старый код. Вот почему мои обновления настоящего activity_main.xml были проигнорированы.

Другие вопросы по теме