52

singleLine è/è stato utilizzato nel file di layout xml per TextView e EditText qualcosa di simile al seguente:L'attributo xml singleLine è deprecato o meno in Android?

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

Some people su SO dicono singleLine è deprecato, mentre other people suggeriscono ancora utilizzarlo. A volte sembra addirittura necessario utilizzarlo quando maxLines="1" non funziona. (vedi here, here e here)

I documenti dovrebbero essere il posto dove andare per rispondere a questa domanda, giusto? 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).

Tuttavia, in the TextView docs, non v'è alcuna indicazione che si è deprecato, sia per android:singleLine o per setSingleLine o per setTransformationMethod. Gli stessi documenti TextView, per confronto, affermano che altre cose come STATUS_BAR_HIDDEN e fitSystemWindows sono deprecate. Quindi la deprecazione di singleLine è un'omissione, è stata "non approvata" o cosa?

Questa domanda è stata previously asked before ma non era l'obiettivo principale della domanda (e non è stata data risposta).

+0

In quali casi _maxLines = "1" _ non funziona? – JafarKhQ

+0

puoi pubblicare il blocco 'code' per entrambi i casi? – Gattsu

+1

Non sto davvero chiedendo qui perché una particolare istanza di 'maxLines =" 1 "' presumibilmente non funzioni. (Potrebbe essere che funzioni davvero in ogni caso.) Voglio solo sapere se 'singleLine' è davvero deprecato o meno. Detto questo, non ho esempi autorevoli ma vedo la sezione 'ellipsize =" selezione "di [questa risposta] (http://stackoverflow.com/a/30029722/3681880) e [questo Q & A] (http : //stackoverflow.com/questions/24351698/textviews-ellipsize-not-working-on-maxlines-1) e anche [questa risposta con i commenti] (http://stackoverflow.com/a/10748836/3681880). – Suragch

risposta

8

Nel grepcode ufficiale della TextView (r1 v5.1.0):

android:singleLine non è annotata con @Deprecated.

Vedo anche questo in setInputType metodo:

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 ignora il valore mSingleLine così.

MODIFICA: Questo attributo xml è ora ufficialmente obsoleto. (since API 3?). Ora è visibile nell'editor xml di AndroidStudio.

39

Penso che la risposta alla tua domanda sia già in uno dei SO posts you linked to. Sfortunatamente, la deprecazione di singleLines non è una questione in bianco e nero.

E è deprecato, ma è non va da nessuna parte in qualunque momento presto.

E 'stato ritirato perché la sua prestazione è scadente, rispetto al suo successore, maxLines. Utilizza SingleLineTransformationMethod per sostituire le nuove righe e i ritorni a capo nella stringa inserita nello TextView, a differenza di maxLines, che "solo" regola l'altezza di TextView in base al numero di righe e non sostituisce le stringhe.

Questo metodo di sostituzione dei caratteri ha anche significato che singleLine potrebbe break in unexpected ways (ad esempio se si utilizzano caratteri personalizzati). Sono stati questi problemi di prestazioni e affidabilità che hanno portato alla sua deprecazione.

Tuttavia, non sta andando da nessuna parte perché, come il SO post che collegato a stati, è ancora in uso da molte applicazioni Android vecchi, e è ancora utile a volte (ad esempio quando si desidera mostrare il intero testo su una riga e ignora carriage-returns e newlines).

Si noti che la deprecazione non significa necessariamente che un'API stia andando via. Significa solo che il suo uso è scoraggiato, ma potrebbe essere permesso.

+0

Se è effettivamente deprecato, non è forse la pratica ufficiale contrassegnarlo come tale in tutta la documentazione? Eppure i documenti di TextView non lo fanno. Questo è ciò che mi spinge a chiedermi se si tratta di una svista o se è intenzionalmente vago o qualcos'altro. – Suragch

+1

@ Suragch sì, è probabile una svista (non sarebbe la prima svista nei documenti Android). Tieni presente che è stato deprecato molto presto nello sviluppo di Android. Infatti, [git commit] (https://github.com/android/platform_frameworks_base/blob/d24b8183b93e781080b2c16c487e60d51c12da31/core/res/res/values/attrs.xml#L1701) che lo ha deprecato è uno dei primi in Github importazione di sorgenti Android ed è datata aprile 2009. È stata deprecata molto presto nello sviluppo, ma non tutti i documenti sono stati aggiornati. – ugo

+0

Non sono sicuro del motivo per cui la documentazione consiglia di utilizzare 'maxLines'. Non fornisce lo stesso comportamento di 'singleLine'. – Eliezer

17

L'attributo deprecato è stato aggiunto nel cambiamento d24b8183b9, che non è altro che una discarica da SCM interno di Google:

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

come si può vedere dal cambiamento core/res/res/values/attrs.xmldiff aggiunge il commento doc @deprecated, ma core/java/android/widget/TextView.javadiff fa non modificare nulla dal commento del doc di setSingleLine().

Ora, senza l'accesso alla storia SCM interno di Google, non è possibile sapere che cosa esattamente ha causato sopra cambiamento attrs.xml doc commento, ma per la tua domanda

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

Una risposta possibile è: TextView 's singolo line non è stata né deprecata né "undeprecated", ma è stata migliorata per tenere in considerazione se la vista è modificabile, un campo password o utilizza qualsiasi altro flag di tipo input che interessa la singola/multi-lineness.

+2

Molte delle risposte qui forniscono alcune utili discussioni e approfondimenti su questo problema, ma poiché il tempo di abbondanza è quasi scaduto, lo sto dando a questa risposta perché entra nel modo più approfondito e trae il massimo da fonti credibili e ufficiali. Non sono ancora pronto a scegliere una risposta accettata, tuttavia. – Suragch

4

Ho solo pensato che aggiungerò che Android Studio 2.2.1 contrassegna singleLine come deprecato. Tuttavia, quello che ho trovato è che nel mio caso:

android:singleLine="false" 

funziona bene, mentre

android:maxLines="2" 

non lo fa.

3

Mentre Android Studio afferma che è deprecato, in realtà avevamo un testo di modifica che dovrebbe consentire a se stesso di essere solo a riga singola.

L'aggiunta di maxLines="1" ha consentito la creazione di caratteri di nuova riga, che non è adatto alle nostre esigenze.

Quindi siamo tornati a utilizzare singleLine="true".

6

singleLine IS deprecato. Nessuna discussione necessaria.

L'unico problema è la documentazione errata.
"utilizzare il flag textMultiLine nell'attributo inputType invece per le visualizzazioni di testo modificabili" è l'esatto contrario di ciò che si desidera ottenere utilizzando singleLine.

Invece di quello è possibile utilizzare android:inputType="text".
Per me ha fatto esattamente quello che volevo: una modifica con una sola riga senza interruzioni di riga.

0

semplice modo alternativo, utilizzare: android:maxLines="1"

3

ho appena aggiunto e rimosso android:inputType="text"android:maxLines="1", ha funzionato bene per me.

+0

Ho rimosso l'attributo singleLine e ho fatto la tua risposta, funziona per me congratulazioni! – oguzhan

3

Proprio per l'aggiunta di qualche informazione in più alla discussione, Lint ha ora il seguente errore:.

"Combinando ellipsize e maxLines=1 può portare a crash su alcuni dispositivi precedenti versioni di pelucchi raccomandato la sostituzione singleLine=true con maxLines=1 ma che dovrebbe non essere fatto quando si utilizza ellipsize

Maggiori informazioni:. https://issuetracker.google.com/issues/36950033 "

Quindi, credo che singleLine è ora, e penso che dovremmo venire con un nuovo termine ... "deprecato"?

1

Solo fornendo android:maxLines="1" e android:minLines="1" non risolverà il problema della questione relativa alla tastiera actionNext. Utilizzare android:inputType="text" per lo stesso.