52

singleLine это/был использован в файлах макета XML для TextView и EditText что-то вроде следующего:Является ли атрибут xml singleLine устаревшим или нет в Android?

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

Some people на SO говорят singleLine является устаревшим, в то время как other people еще предлагают использовать его. Иногда даже кажется необходимым использовать, когда maxLines="1" не работает. (см. here, here и here)

Документы должны быть местом для ответа на этот вопрос, не так ли? Here, they say:

This constant was deprecated in API level 3.

This attribute is deprecated. Use maxLines instead to change the layout of a static text, and use the textMultiLine flag in the inputType attribute instead for editable text views (if both singleLine and inputType are supplied, the inputType flags will override the value of singleLine).

Однако in the TextView docs, нет никаких признаков того, что он является устаревшим, либо для android:singleLine или для setSingleLine или для setTransformationMethod. Те же документы TextView, в сравнении, указывают, что другие вещи, такие как STATUS_BAR_HIDDEN и fitSystemWindows, устарели. Так что угасание singleLine упущено, было ли это «недостоверным», или что?

Этот вопрос был previously asked before, но не был в центре внимания вопроса (и не был дан ответ).

+0

В каких случаях _maxLines = "1" _ не работает? – JafarKhQ

+0

можете ли вы разместить блок «code» для обоих случаев? – Gattsu

+1

Я не спрашиваю здесь, почему конкретный экземпляр 'maxLines =" 1 "' предположительно не работает. (Может быть, он действительно работает в каждом экземпляре.) Я просто хочу знать, действительно ли 'singleLine' устарел или нет. При этом у меня нет никаких авторитетных примеров, но см. Раздел «ellipsize =» marquee «[этот ответ] (http://stackoverflow.com/a/30029722/3681880) и [этот вопрос и ответы] (http : //stackoverflow.com/questions/24351698/textviews-ellipsize-not-working-on-maxlines-1), а также [этот ответ с комментариями] (http://stackoverflow.com/a/10748836/3681880). – Suragch

ответ

8

В официальном grepcode из TextView (v5.1.0 Г1):

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 так.

EDIT: Этот атрибут xml теперь официально устарел. (since API 3?). Теперь это видно в редакторе xml.

39

Я думаю, что ответ на ваш вопрос уже находится в одном из SO posts you linked to. К сожалению, устаревание singleLines не является черно-белым.

Это является устаревшим, но это не никуда в ближайшее время.

Было устарело, потому что его производительность плохой, относительно его преемника, maxLines. Он использует SingleLineTransformationMethod для замены строк и возвратов каретки в String, который вы размещаете в TextView, в отличие от maxLines, который «просто» регулирует высоту TextView в зависимости от количества строк и не заменяет String.

Этот метод замены символов также означает, что singleLine может break in unexpected ways (например, если вы используете пользовательские шрифты). Именно эти проблемы производительности и надежности привели к его устареванию.

Однако она не денется, потому что, как SO сообщению, вы связаны с состояниями, она до сих пор используется многими старыми приложениями Android, и это еще полезно иногда (например, когда вы хотите показать весь текст на одной строке и игнорировать возврат каретки и символы перевода строки).

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

+0

Если это на самом деле не рекомендуется, то разве официальная практика не должна отмечать его как таковую в документации? Однако документы TextView этого не делают. Вот что заставляет меня задаться вопросом, является ли это надзором или если он целенаправленно расплывчато или что-то еще. – Suragch

+1

@ Сурагч, да, это, скорее всего, надзор (это не было бы первым недосмотром в документах Android). Имейте в виду, что он очень устарел в разработке Android. Фактически, [git commit] (https://github.com/android/platform_frameworks_base/blob/d24b8183b93e781080b2c16c487e60d51c12da31/core/res/res/values/attrs.xml#L1701), который не рекомендуется, является одним из первых в Github's импорт источника Android и датирован апрелем 2009 года. Он был устаревшим в начале разработки, но не все документы были обновлены. – ugo

+0

Я не уверен, почему в документации рекомендуется использовать 'maxLines'. Он не обеспечивает такое же поведение, как «singleLine». – Eliezer

17

Устаревшей атрибут был добавлен в изменении d24b8183b9, который не что иное, как свалка из внутренней SCM компании Google:

auto import from //branches/cupcake/[email protected]

Как видно из изменения core/res/res/values/attrs.xmldiff добавляет @Deprecated DOC комментарий, но core/java/android/widget/TextView.javadiff делает не изменяйте ничего из комментария setSingleLine().

Теперь без доступа к внутренней истории SCM Google, это не представляется возможным, чтобы знать, что именно вызвало выше изменения в attrs.xml док комментарий, но на ваш вопрос

So is the singleLine deprecation an omission, was it "undeprecated", or what?

один возможный ответ: TextView «s одно- строка не была ни устарела, ни «недостоверена», но она была усилена, чтобы учесть, доступно ли редактируемое представление, поле пароля или использует любой другой флаг входного типа, который влияет на одиночную/многоязычность.

+2

Некоторые из ответов здесь дают некоторое полезное обсуждение и понимание этой проблемы, но, поскольку время щедрости почти вверх, я награждаю его этим ответом, потому что он проникает в самую глубину и извлекает наибольшую пользу из достоверных и официальных источников. Однако я не совсем готов принять принятый ответ. – Suragch

4

Просто подумал, что добавлю, что Android Studio 2.2.1 флаги singleLine являются устаревшими. Однако то, что я обнаружил, что в моем случае:

android:singleLine="false" 

работает хорошо, в то время как

android:maxLines="2" 

не делает.

3

Хотя Android Studio утверждает, что она устарела, на самом деле у нас был текст редактирования, который должен позволять себе быть только однострочным.

Добавление maxLines="1" позволило использовать символы новой строки, что не подходит для наших нужд.

Итак, мы вернулись к использованию singleLine="true".

6

singleLine Устаревший. Не требуется обсуждения.

Единственная проблема - неправильная документация.
"использовать флаг textMultiLine в атрибуте inputType вместо редактируемых текстовых представлений" является прямой противоположностью того, чего вы хотите достичь, используя singleLine.

Вместо этого вы можете использовать android:inputType="text".
Для меня это сделало именно то, что я хотел - редактирование одной строкой без разрывов строк.

0

Простой альтернативный способ, с помощью: android:maxLines="1"

3

Я просто добавил android:inputType="text" и удалены android:maxLines="1", он работал нормально для меня.

+0

Я удалил атрибут singleLine, и я сделал ваш ответ, он работает для меня поздравлениями! – oguzhan

3

Просто для добавления больше информации к обсуждению, Lint теперь имеет следующую ошибку:.

«Объединение ellipsize и maxLines=1 может привести к сбоям на некоторых устройствах более ранние версии пуха рекомендовали заменить singleLine=true с maxLines=1 но должен не может быть сделано при использовании ellipsize

Подробнее:. https://issuetracker.google.com/issues/36950033 "

Таким образом, я предполагаю, что singleLine сейчас, и я думаю, что мы должны придумать с новым термином ... «устарели»?

1

Только предоставление android:maxLines="1" и android:minLines="1" не разрешит проблему с клавиатурой actionNext относящаяся к проблеме проблема. Используйте для этого android:inputType="text".

Смежные вопросы