Ellisse non funziona per textView all'interno di listView personalizzato
Domanda
Ho un listView con oggetti personalizzati definiti dal layout xml di seguito. Voglio il textView con ID " info " per essere ellissizzato su una sola riga e ho provato a usare gli attributi
android:singleLine="true"
android:ellipsize="end"
senza successo.
Se imposto layout_width su una larghezza fissa come ad esempio
android:layout_width="100px"
il testo viene troncato bene. Ma per motivi di portabilità questa non è una soluzione accettabile.
Riesci a individuare il problema?
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingBottom="5px"
>
<TextView
android:id="@+id/destination"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="22dp"
android:paddingLeft="5px"
/>
<TextView
android:id="@+id/date"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="15dp"
android:paddingLeft="5px"
/>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/info_table"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingLeft="5px"
android:paddingTop="10px"
>
<TableRow>
<TextView
android:id="@+id/driver_label"
android:gravity="right"
android:paddingRight="5px"
android:text="@string/driver_label" />
<TextView
android:id="@+id/driver" />
</TableRow>
<TableRow>
<TextView
android:id="@+id/passenger_label"
android:gravity="right"
android:paddingRight="5px"
android:text="@string/passenger_label" />
<TextView
android:id="@+id/passengers" />
</TableRow>
<TableRow>
<TextView
android:id="@+id/info_label"
android:gravity="right"
android:paddingRight="5px"
android:text="@string/info_label"/>
<TextView
android:id="@+id/info"
android:layout_width="fill_parent"
android:singleLine="true"
android:ellipsize="end" />
</TableRow>
</TableLayout>
Soluzione
L'ellipsize è interrotta (vai vota sulla segnalazione di bug , soprattutto perché sostengono che non è riproducibile), quindi è necessario utilizzare un hack minore. Usa:
android:inputType="text"
android:maxLines="1"
su tutto ciò che vuoi ellissize. Inoltre, non utilizzare singleLine
, è stato deprecato.
UPDATE:
A un esame più attento, il problema che stai riscontrando è che il tuo tavolo si sta estendendo dal lato destro dello schermo. Modifica della definizione TableLayout
in:
<TableLayout
android:id="@+id/info_table"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingLeft="5px"
android:paddingTop="10px"
android:shrinkColumns="1">
dovrebbe risolvere quel problema, quindi fai quello che ho detto sopra per ellissizzare il tuo TextView
.
Altri suggerimenti
Senza usare proprietà deprecate, le seguenti righe funzionano perfettamente per me
android:ellipsize="end"
android:lines="1"
android:scrollHorizontally="true"
ref http://code.google.com/p / android / emissioni / dettaglio? id = 882 # C9
Ho avuto gli stessi risultati di Steve:
android: ellipsize = " tendone " android: scrollHorizontally = " allineare " android: linee = " 1 "
funziona perfettamente
provare ...
cioè.
android:ellipsize="marquee"
android:focusable="true" android:marqueeRepeatLimit="num|marquee_forever"
android:lines="1" android:focusableInTouchMode="true"
android:scrollHorizontally="true"
poiché il riquadro di selezione funziona solo quando la vista è selezionata o focalizzata in base al commento # 2 su http://code.google.com/p/android/issues/detail?id=5364
Dopo aver verificato questi 3 problemi (chiuso e riaperto) e i post precedenti, penso che la chiave sia avvolgere TextView con un LinearLayout esterno (o qualsiasi altro layout che stai utilizzando) e impostare il " < strong> layout_width " di larghezza del layout esterno leggermente PIÙ PICCOLO rispetto alla lunghezza del testo contenuta in TextView. Sembra che debba LIMITARE la larghezza per rendere " android: ellipsize " comportarsi correttamente.
Segui il suggerimento in questo problema , dopo aver aggiunto tutti questi attributi per l'hacking, ho anche impostato layout_width di LinearLayout esterno su 240dp, ad esempio:
<Linearlayout
android:layout_width="240dp"
android:layout_height="wrap_content"
...>
<TextView
....
android:singleLine="true"
android:lines="1"
android:maxLines="1"
android:scrollHorizontally="true"
android:ellipsize="end"
android:text="this is a text which length should be longer than 240dp"
/>
</LinearLayout>
Di quanto riesca a fare con successo la fine di TextView che visualizza " ... " ;, non molto accettabile ma funziona! E penso che funzioni se utilizzato in TextView normale o TextView in un adattatore di elenco.
Ecco il mio screenshot per il risultato!
Rif di questi 3 numeri:
Ho trovato da qualche parte questi attributi
<TextView ...
android:singleLine="true"
android:ellipsize="marquee" />
funziona bene per me (Android 1.5)
Per me questi attributi hanno funzionato. Ho testato su API 8 e successive
In XML
<TextView
....
android:maxLines="1"
android:scrollHorizontally="true"
android:ellipsize="end"
....
/>
a livello di codice
setMaxLines(1);
setEllipsize(TruncateAt.END);
setHorizontallyScrolling(true);
Se inserisci TextView in un ViewGroup personalizzato che hai creato, assicurati di misurarlo di nuovo se hai cambiato la dimensione dopo la misurazione.
Ad esempio, ho calcolato la nuova dimensione in onLayout. Prima di chiamare child.layout, chiama
measureChild(child,
View.MeasureSpec.makeMeasureSpec(childWidth, View.MeasureSpec.EXACTLY),
View.MeasureSpec.makeMeasureSpec(childHeight, View.MeasureSpec.EXACTLY));
Ho avuto lo stesso problema nella scheda di visualizzazione del riciclatore. Ho risolto questo aggiungendo il seguente codice:
<TextView
android:ellipsize="end"
android:maxLines="1"/>