2012-03-26 10 views
43

Qualcuno può spiegare chiaramente con esempi cosa significano ciascuno dei span flags come SPAN_EXCLUSIVE_EXCLUSIVE e SPAN_MARK_MARK e quando utilizzare i flag?Spiegare il significato delle flag di span come SPAN_EXCLUSIVE_EXCLUSIVE

Non capisco la documentazione ufficiale, quando dice:

campate di tipo SPAN_EXCLUSIVE_EXCLUSIVE non espandersi per includere il testo inserito sia a loro punto iniziale o finale.

"espandere per includere" si riferiscono alle modifiche apportate dopo l'inserimento delle span?

Significa che questi flag NON influiscono su Spannable con testo immutabile?

risposta

69

"espandere per includere" si riferiscono alle modifiche apportate dopo l'inserimento delle span?

Sì. Ad esempio, supponiamo di avere quanto segue:

Il numero volpe è saltato.

Se abbiamo usato SPAN_EXCLUSIVE_EXCLUSIVE sulla durata grassetto, e inseriamo il testo al centro della campata, è ancora grassetto:

Il quick brown fox saltato.

Tuttavia, se inseriamo testo all'inizio o alla fine della campata grassetto, il testo inserito non è grassetto:

La realtà veloce volpe saltato.

Se, tuttavia, avevamo usato SPAN_INCLUSIVE_EXCLUSIVE, poi l'inserimento di testo all'inizio sarebbe stato incluso come parte della campata, e avremmo:

Il molto veloce volpe saltato.

Significa che questi flag NON influiscono su Spannable con testo immutabile?

Direi che hanno un uso limitato per il testo immutabile. Per lo più, questi saranno usati con SpannableStringBuilder o cose che ne usano uno sotto le copertine (ad esempio, EditText).

+1

, buona risposta. Puoi spiegare altre bandiere con spanning? Si prega di consultare http://stackoverflow.com/q/16392417/596555 – boiledwater

50

Che le bandiere non significano

Quando ho visto le INCLUSIVE e EXCLUSIVE parti delle Spannable bandiere, ho pensato che hanno appena detto o meno la durata comprendeva le posizioni di inizio e di indice fine del brano. Questo non è vero. Lasciatemi illustrare ciò con il seguente esempio.

String myString = ""; 
int start = 1; 
int end = 3; 
int spanFlag = Spannable.SPAN_INCLUSIVE_INCLUSIVE; // this is what is changing 

SpannableString spannableString = new SpannableString(myString); 
ForegroundColorSpan foregroundSpan = new ForegroundColorSpan(Color.RED); 
spannableString.setSpan(foregroundSpan, start, end, spanFlag); 
textView.setText(spannableString); 

Ecco i risultati:

SPAN_INCLUSIVE_INCLUSIVE

enter image description here

SPAN_INCLUSIVE_EXCLUSIVE

enter image description here

SPAN_EXCLUSIVE_INCLUSIVE

enter image description here

SPAN_EXCLUSIVE_EXCLUSIVE

enter image description here

Sono tutti uguali! Le bandiere non influenzano lo span. Un'intervallo sempre include il carattere al suo indice iniziale ed esclude il carattere nell'indice finale.

Quali le bandiere significano veramente

I INCLUSIVE e EXCLUSIVE parti delle bandiere Spannable effettivamente dire se la campata dovrebbe includere testo che viene inserito all'inizio o alla fine posizioni.

Ecco un esempio modificato per illustrarlo.

String myString = ""; 
int start = 1; 
int end = 3; 
int spanFlag = Spannable.SPAN_INCLUSIVE_INCLUSIVE; // this is what is changing 

// set the span 
SpannableStringBuilder spannableString = new SpannableStringBuilder(myString); 
ForegroundColorSpan foregroundSpan = new ForegroundColorSpan(Color.RED); 
spannableString.setSpan(foregroundSpan, start, end, spanFlag); 

// insert the text after the span has already been set 
// (inserting at start index second so that end index doesn't get messed up) 
spannableString.insert(end, "x"); 
spannableString.insert(start, "x"); 

textView.setText(spannableString); 

Ecco i risultati dopo l'inserimento di un x alla fine e iniziare indici:

SPAN_INCLUSIVE_INCLUSIVE

enter image description here

SPAN_INCLUSIVE_EXCLUSIVE

enter image description here

SPAN_EXCLUSIVE_INCLUSIVE

enter image description here

SPAN_EXCLUSIVE_EXCLUSIVE

enter image description here

Note

  • La maggior parte di questa risposta descrive cose del PO già conosceva. Lo sto solo aggiungendo per i futuri visitatori come me che non conoscevano queste cose.
  • Nel secondo esempio ho dovuto usare un SpannableStringBuilder perché il testo in un SpannableString è immutabile, quindi non è possibile inserire del testo in esso. Pertanto, le bandiere sono generalmente prive di significato per un SpannableString.Tuttavia, si potrebbe immaginare una situazione in cui gli span da uno SpannableString vengono copiati su un SpannableStringBuilder o Editable, e da lì le bandiere avrebbero un significato.
  • See this answer per la differenza tra SpannableString, SpannableStringBuilder, Editable e altro.
Problemi correlati