wake-up-neo.com

Ist das XML-Attribut singleLine veraltet oder nicht in Android?

singleLine ist/wurde in XML-Layoutdateien für TextView und EditText verwendet, etwa wie folgt:

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

Einige Personen auf SO sagen, singleLine ist veraltet, während andere Personen immer noch die Verwendung von _ vorschlagen. Manchmal scheint es sogar notwendig zu sein, wenn maxLines="1" nicht funktioniert. (siehe hier , hier und hier )

Die Dokumente sollten der richtige Ort sein, um diese Frage zu beantworten, oder? Hier sagen sie:

Diese Konstante wurde in API-Level 3 nicht mehr unterstützt. 

Dieses Attribut lautet veraltet Verwenden Sie stattdessen maxLines, um das Layout einer statischen .__ zu ändern. Text, und verwenden Sie das Flag textMultiLine im inputType-Attribut stattdessen für bearbeitbare Textansichten (wenn sowohl singleLine als auch inputType bereitgestellt werden, überschreiben die inputType-Flags den Wert von singleLine).

In den TextView-Dokumenten gibt es jedoch keinen Hinweis, dass es veraltet ist, weder für Android:singleLine noch für setSingleLine oder für setTransformationMethod . Dieselben TextView-Dokumente geben zum Vergleich an, dass andere Dinge wie STATUS_BAR_HIDDEN und fitSystemWindows veraltet sind. Ist also die singleLine-Ausweisung eine Auslassung, war sie "nicht bewertet" oder was? 

Diese Frage war zuvor schon einmal gestellt , war aber nicht der Schwerpunkt der Frage (und wurde nicht beantwortet).

57
Suragch

Ich denke, die Antwort auf Ihre Frage befindet sich bereits in einem der SO Posts, auf die Sie verlinkt haben . Leider ist die Abwertung von singleLines nicht schwarz -oder-weiße Substanz.

Es ist ist veraltet, aber es ist nicht irgendwohin zu jeder Zeit in Kürze.

Es wurde verworfen, weil seine Leistung im Vergleich zu seinem Nachfolger maxLines schlecht ist. Es verwendet SingleLineTransformationMethod , um Zeilenumbrüche und Zeilenumbrüche in der Zeichenfolge zu ersetzen, die Sie in TextView einfügen, im Gegensatz zu maxLines, das "nur" die Höhe anpasst des TextView basiert auf der Anzahl der Zeilen und ersetzt keinen String.

Diese Methode zum Ersetzen von Zeichen bedeutete auch, dass singleLineauf unerwartete Weise unterbrochen (z. B. wenn Sie benutzerdefinierte Schriftarten verwenden). Es waren diese Leistungs- und Zuverlässigkeitsprobleme, die zu seiner Nichtbeachtung führten.

Jedoch wird es nirgendwo hingehen, weil , wie der SO= Post, den Sie mit Staaten verknüpft haben, noch verwendet wird Bei vielen alten Android Anwendungen, und ist es manchmal immer noch nützlich (zB wenn Sie den gesamten Text anzeigen möchten Zeilenumbrüche und Zeilenumbrüche ignorieren).

Beachten Sie, dass Verfall nicht unbedingt bedeutet, dass eine API nicht mehr verfügbar ist. Dies bedeutet lediglich, dass von seiner Verwendung abgeraten wird, diese jedoch zulässig sein kann.

45
ugo

Das veraltete Attribut wurde in change d24b8183b9 hinzugefügt. Dies ist nichts anderes als ein Speicherauszug von Googles internem SCM:

autoimport aus //branches/cupcake/[email protected]

Wie aus der Änderung hervorgeht, fügt core/res/res/values/attrs.xmldiff den @deprecated-Dokumentkommentar hinzu, core/Java/Android/widget/TextView.Javadiff ändert jedoch nichts an dem Dokumentkommentar von setSingleLine().

Ohne Zugriff auf die interne SCM-Historie von Google ist es nicht möglich zu wissen, was genau in attrs.xml doc kommentiert wurde, sondern für Ihre Frage

Ist also die singleLine-Ausweisung eine Auslassung, war sie "nicht bewertet" oder was?

eine mögliche Antwort ist: TextViews einzeilige Zeile war weder veraltet noch "undeprecated", wurde jedoch dahingehend erweitert, dass berücksichtigt wird, ob die Ansicht editierbar ist, ein Kennwortfeld ist oder ein anderes Eingabe-Typ-Flag verwendet wird, das die Einzel-/Mehrfachwäscherei beeinflusst.

18
ozbek

Im offiziellen grepcode von TextView (v5.1.0 r1):

Android:singleLine ist nicht mit @Deprecated kommentiert.

Ich sehe das auch in 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 überschreibt so den mSingleLine-Wert.

BEARBEITEN: Dieses XML-Attribut ist jetzt offiziell veraltet. ( seit API 3? ). Es ist jetzt im AndroidStudio-XML-Editor sichtbar.

9
Täg

singleLine IS veraltet. Keine Diskussion nötig.

Das einzige Problem ist die falsche Dokumentation.
"Verwenden Sie stattdessen das textMultiLine-Flag im inputType-Attribut für bearbeitbare Textansichten" ist das direkte Gegenteil dessen, was Sie mit singleLine erreichen möchten.

Stattdessen können SieAndroid:inputType="text"verwenden. 
Für mich hat es genau das gemacht, was ich wollte - eine Bearbeitung mit einer einzelnen Zeile ohne Zeilenumbrüche.

6

Ich habe nur gedacht, dass ich hinzufügen werde, dass Android Studio 2.2.1 singleLine als veraltet markiert Was ich jedoch gefunden habe, ist das in meiner Instanz:

Android:singleLine="false"

funktioniert gut, während 

Android:maxLines="2"

nicht. 

4
Seb

Während Android Studio behauptet, es sei veraltet, hatten wir in Wirklichkeit einen Bearbeitungstext, der nur einzeilig sein sollte.

Durch das Hinzufügen von maxLines="1" wurden Zeilenumbrüche zugelassen, die für unsere Anforderungen nicht geeignet sind.

Also haben wir wieder singleLine="true" verwendet.

4
EpicPandaForce

Nur um weitere Informationen zur Diskussion hinzuzufügen, hat Lint jetzt den folgenden Fehler:

"Die Kombination von ellipsize und maxLines=1 kann auf einigen Geräten zu Abstürzen führen. In früheren Versionen von lint wurde empfohlen, singleLine=true durch maxLines=1 zu ersetzen. Dies sollte jedoch bei Verwendung von ellipsize nicht geschehen.

Weitere Informationen: https://issuetracker.google.com/issues/36950033 "

Ich denke also, dass singleLine jetzt ist, und ich denke, wir sollten uns einen neuen Begriff einfallen lassen ... "veraltet"?

4
Rui

Ich habe gerade Android:inputType="text" hinzugefügt und Android:maxLines="1" entfernt, es hat gut für mich funktioniert.

3
Divya

Wenn Sie nur Android:maxLines="1" und Android:minLines="1" angeben, wird das Problem mit der Tastatur actionNext nicht gelöst. Verwenden Sie Android:inputType="text" für dasselbe.

1
oj24031989

Einfache Alternative, verwenden Sie: Android:maxLines="1"

0