Является ли атрибут xml singleLine устаревшим или нет в Android?

singleLine используется/используется в файлах макета xml для TextView и EditText что-то вроде следующего:

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

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

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

Эта константа была устарела в уровне API 3.

Этот атрибут осуждается. Используйте maxLines вместо этого, чтобы изменить компоновку статического текст и использовать флаг textMultiLine в атрибуте inputType вместо этого для редактируемых текстовых представлений (если и singleLine, и inputType, флаги inputType будут переопределять значение singleLine).

Однако в документах TextView, нет никаких указаний на то, что он устарел, либо для android:singleLine или для setSingleLine или для setTransformationMethod. Те же документы TextView, если сравнивать, указывают, что другие вещи, такие как STATUS_BAR_HIDDEN и fitSystemWindows, устарели. Так ли обесценивание singleLine упущено, было ли это "недостоверным", или что?

Этот вопрос был ранее задан до, но не был основным предметом вопроса (и на него не ответил).

Ответ 1

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

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

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

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

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

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

Ответ 2

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

автоматический импорт из//ветвей/cupcake/[email protected]

Как видно из изменения core/res/res/values/attrs.xml diff добавляется комментарий @deprecated doc, но core/java/android/widget/TextView.java diff ничего не меняет из комментария setSingleLine() doc.

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

Итак, отказ singleLine упущения, было ли это "недостоверным" или что?

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

Ответ 3

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

android:singleLine не аннотируется с помощью @Deprecated.

Я также вижу это в setInputType method:

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 теперь официально устарел. (с API 3?). Теперь он отображается в редакторе xStudio для AndroidStudio.

Ответ 4

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

Единственная проблема - неправильная документация.
"Использовать флаг textMultiLine в атрибуте inputType вместо доступных для редактирования текстовых представлений" - это прямая противоположность тому, чего вы хотите достичь, используя singleLine.
< ш > Вместо этого вы можете использовать android:inputType="text".
Для меня он сделал именно то, что я хотел - редактирование с одной строкой без разрывов строк.

Ответ 5

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

android:singleLine="false"

работает хорошо, тогда как

android:maxLines="2"

нет.

Ответ 6

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

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

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

Ответ 7

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

Ответ 8

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

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

Дополнительная информация: https://issuetracker.google.com/issues/36950033"

Итак, я предполагаю, что singleLine теперь, и я думаю, что мы должны придумать новый термин... "deprecatedish"?

Ответ 9

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