Android: gli span SPAN_EXCLUSIVE_EXCLUSIVE non possono avere lunghezza zero


190

Ho il seguente layout (praticamente vuoto):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/set_layout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:contentDescription="content desc"
    android:orientation="vertical" >

    <TextView android:id="@+id/text"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="Hello, I am a TextView" />
</LinearLayout>

La classe Activity contiene quanto segue:

public class TestActivity extends Activity {
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test);   
  }
}

Quando eseguo questo sul mio dispositivo mobile ottengo il seguente errore:

SpannableStringBuilder
SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length

Ho provato questo con e senza TextView e l'errore persiste, devo fare qualcosa di fondamentalmente sbagliato perché un layout così basilare possa causare questo.

Qualcuno ha qualche idea su come posso caricare questo senza l'errore?


Esamina LogCat e osserva la traccia dello stack associata al tuo errore. Se effettivamente proviene da questa app, pubblica l'intera traccia dello stack come modifica alla tua domanda. Inoltre, mi sbarazzerei di , android:contentDescriptiondal LinearLayoutmomento che quel contenitore non è focalizzabile e quindi la descrizione non verrà utilizzata AFAIK.
CommonsWare il

6
Grazie per la risposta. Sfortunatamente non c'è traccia dello stack per questo errore, l'output è esattamente come ho postato sopra, ma il campo dell'applicazione in LogCat punta alla mia applicazione. Ho eseguito il debug del codice e ho attraversato ogni riga senza che venga generato alcun errore, quindi deve trovarsi da qualche parte nel codice Android che si aspetta qualcosa che non c'è.
DMac,

Vorrei sapere come evitare anche questo fastidioso errore, senza rimuovere / disabilitare alcuna funzionalità per l'utente finale.
sviluppatore Android

1
Ho ripristinato le impostazioni di fabbrica del telefono ed è andato via, dopo aver provato la "correzione della tastiera Samsung" che non mi sembrava fare il trucco ...
Shark,

Forse non è affatto un problema, ma dopo l'aggiornamento ad Android 4.1.1 vedo molti errori nei registri come questo. Gli span SPAN_EXCLUSIVE_EXCLUSIVE non possono avere lunghezza zero
Sagar Raiyani,

Risposte:


241

Ho incontrato le stesse voci di errore in LogCat. Nel mio caso è causato dalla tastiera di terze parti che sto usando. Quando lo cambio di nuovo sulla tastiera Android, la voce di errore non viene più visualizzata.


3
grazie @Rabi, anche io sono passato a swiftkey e ho iniziato a ricevere l'errore.
Maulik Sheth,

2
Ottengo l'errore mentre utilizzo la tastiera Android di serie su un Nexus 7 (edizione 2012, in esecuzione 4.3)
Tom,

(Su Galaxy S4, 4.4.2) - Il passaggio alla tastiera Samsung originale ha risolto questo problema per me. Grazie!
FateNuller,

6
Purtroppo il link di @Rabi sopra non è più valido. Ma grazie per questo. Sto davvero usando SwiftKey e sembra che stia ancora causando questo problema 2 anni dopo.
Splaktar,

1
Questo problema si presenta anche con Gboard (!) (Ed è di Google)
Aenadon,

113

Perché l'errore che stai ricevendo non è correlato a un EditText, allora non lo è collegato alla tastiera.

Gli errori che stai riscontrando non sono il risultato del tuo codice; probabilmente stai testando su un dispositivo Samsung con TouchWiz Samsung.

Ho avuto gli stessi errori, poi ho provato su un Nexus S (anche Samsung, ma puro sistema operativo Android senza TouchWiz) e non ho riscontrato questo errore.

Quindi, nel tuo caso, ignora questi errori durante il test su un dispositivo! :)


1
È la tua tastiera, probabilmente la tastiera di TouchWiz nel tuo caso. Ho gli stessi errori su un Nexus 4 con Swiftkey, se scelgo la tastiera Android predefinita gli errori scompaiono.
Dante,

Le tastiere possono sicuramente portare a questo errore, ma nel caso in cui la tastiera non sia utilizzata o chiamata, ovvero nel caso in cui non ci siano EditText, non vedo come la tastiera possa essere la fonte del problema. Quando passo tra due diverse attività, entrambe senza EditText, continuo a ricevere l'errore ogni volta che vado a una di queste attività.
Karim

2
Sono d'accordo con Cookiki, gli errori sono dovuti a Samsung TouchWiz e non sta causando altri problemi oltre a vomitare errori in logcat. Quindi li
ignorerà

Non possiamo semplicemente ignorare gli errori perché succede solo su un TouchWiz, il minimo è riferire a Samsung che c'è un problema con TouchWiz.
Sojurn,

1
Posso sicuramente verificarsi senza che sia correlato a un EditText. Ho riscontrato questo errore durante la visualizzazione di un PreferenceFragment con alcune intestazioni: nessuna casella di testo o qualcosa del genere. Ad ogni cambio da un PreferenceFragment ho ricevuto due di questi messaggi di errore. Passato da "Samsung Keyboard" a "Smart Keyboard Pro" e i messaggi di errore si sono interrotti.
Magnus W,

46

Guardando il tuo codice, non sono sicuro del motivo per cui ricevi questo errore, ma ho avuto lo stesso errore ma con i campi EditText.

Modifica android:inputType="text"(o una qualsiasi delle altre varianti di testo di inputType) in android:inputType="textNoSuggestions"(oandroid:inputType="textEmailAddress|textNoSuggestions" , ad esempio) ha risolto il problema per me.

Puoi anche impostare questo nel codice con qualcosa di simile

mInputField.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);

Sembra che Android presuma per impostazione predefinita che i campi EditText avranno suggerimenti. Quando non lo fanno, si sbaglia. Non fiducioso al 100% in questa spiegazione, ma le modifiche sopra menzionate lo hanno risolto per me.

http://developer.android.com/reference/android/text/Spanned.html#SPAN_EXCLUSIVE_EXCLUSIVE

Spero che questo ti aiuti!


Grazie per questo. Ma anche con TextView rimosso e solo il layout presente ottengo l'errore. E 'molto strano.
DMac,

Rimuovere il contenuto Descrizione da LinearLayout non aiuta?
tim

2
No, sfortunatamente no. Anche se con ulteriori indagini, l'errore sembra essere visualizzato solo su dispositivi Samsung.
DMac,

14

Sul tuo telefono Android vai su:
Impostazioni -> Gestione applicazioni -> Tutto -> Tastiera Samsung, quindi fai clic su "Svuota cache"
(elimina tutti i dati raccolti da questa applicazione).


Wow, ho avuto 68 MB di roba nella cache di quell'app. : O
XåpplI'-I0llwlg'I -

11

Prova a utilizzare la tastiera Android predefinita che scomparirà


come usare la tastiera predefinita.
NagarjunaReddy

1
Devi cambiarlo nelle impostazioni di input del telefono. Se non l'hai modificato, dovresti avere la tastiera predefinita. È una soluzione abbastanza divertente con quella tastiera predefinita, ma funziona per me ..: p
Krystian

4
Anche la tastiera Android predefinita presenta il problema (ce l'ho su un Nexus 5)
Yoann Hercouet

4

Chiarisci di aver passato un valore in MainAcitivity per i seguenti metodi onCreateOptionsMenu e onCreate

In alcuni casi, lo sviluppatore elimina l'istruzione "return super.onCreateOptionsMenu (menu)" e modificato in "return true".


3

Questo ha funzionato per me ... su ogni dispositivo

    <EditText
        android:maxLines="1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textSize="15sp"
        android:layout_centerVertical="true"
        android:textColor="#000"
        android:id="@+id/input_search"
        android:background="@null"
        android:inputType="text"
        android:hint="Enter Address, City or Zip Code"
        android:imeOptions="actionSearch"
        />

Nel codice Java:

mSearchText.setOnEditorActionListener(new TextView.OnEditorActionListener() {

        @Override
        public boolean onEditorAction(TextView textView, int actionId, KeyEvent keyEvent) {
            if(actionId == EditorInfo.IME_ACTION_SEARCH
                    || actionId == EditorInfo.IME_ACTION_DONE
                    || keyEvent.getAction() == KeyEvent.ACTION_DOWN
                    || keyEvent.getAction() == KeyEvent.KEYCODE_ENTER){

                //execute our method for searching
            }

            return false;
        }
    });

Grazie. Ha funzionato come per incanto
swapnil gandhi il

sembra che avere un ascoltatore sia un must
AndroidHV

Ciao amici, nel mio schermo non uso alcun testo di modifica, utilizzo solo layout lineare e pulsante. Devo affrontare lo stesso problema quando eseguo un'app su tablet (4.1.2).
Hardik,

1

Ho avuto lo stesso avvertimento e ho scoperto che la rimozione di un @id inutilizzato ha eliminato l'avviso. Per me era ovvio poiché @id era associato a un elenco crescente di visualizzazioni di testo collegate a un database, quindi c'era un avviso per ogni voce.


1

Masood Moshref ha ragione, questo errore si verifica perché il menu delle opzioni di Menu non è ben preparato mancando "return super.onCreateOptionsMenu (menu)" nel metodo onCreate ().


1

Per provare a eseguire il debug di questo errore, prima vai sul tuo terminale / console Android ed esegui questo comando:

ps | grep THE_ERROR_PID_YOU_GET_(IT_IS_A_NUMBER)

quindi se l'output viene visualizzato come app ... è la tua app che causa l'errore. Prova a cercare il vuoto Stringsche passi nel file layout.

Ho avuto lo stesso identico problema ed è stata colpa mia mentre passavo un vuoto Stringnel mio layout. Dopo aver modificato il ""in " "questo errore è andato via.

Se non ottieni l'app dall'output della console, è qualcos'altro che la causa (probabilmente, come altri hanno detto, la tastiera Android)


0

Ho affrontato lo stesso problema. Ho quasi perso quasi un paio di settimane per risolvere questo problema. Alla fine ho avuto dubbi su me stesso e ho provato a creare un altro progetto copiando e incollando alcuni file di avvio come SplashScreen e LoginScreen.

Ma con lo stesso codice stavo ancora ottenendo SPAN_EXCLUSIVE_EXCLUSIVE .

Quindi ho rimosso il codice del gestore dalla schermata iniziale e riprovato e Wow funziona. Non riscontro il problema SPAN_EXCLUSIVE_EXCLUSIVE in logcat .

Mi chiedo, perché lo è? fino a quando il tempo non ha avuto altra soluzione ma rimuovendo il gestore dalla schermata di avvio funziona.

Prova e aggiorna qui se è stato risolto o meno.


0

Controlla se hai qualche elemento come pulsante o vista di testo duplicato (copiato due volte) nella schermata in cui si verifica questo. L'ho fatto inosservato e ho dovuto affrontare lo stesso problema.


0

Ho riscontrato questo problema anche quando ho copiato del testo da Internet. La mia soluzione è tagliare il testo / rimuovere la formattazione prima di eseguire qualsiasi ulteriore elaborazione.


0

Ho avuto lo stesso problema ma con un listView .... l'ho risolto perché stavo usando un R.id.listView sbagliato che l'elenco View aveva bisogno di avere un valore, nel mio caso erano le stringhe che ho salvato su listView2 ... quindi il codice giusto era R.id.listView2


0

Ho avuto lo stesso problema, quindi l'ho risolto seguendo il codice!

  text = (EditText)findViewById(R.id.TextVoiceeditText); 
  text.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);

0

questo errore si verifica anche a causa della modifica dell'URL dell'API. prova a colpire l'URL che stai usando in postman ec se funziona correttamente. ricontrollare le API ha risolto il mio problema


0

prova a evitare l'uso della vista in xml design. Anch'io ho avuto lo stesso problema ma quando ho rimosso la vista. ha funzionato perfettamente.

come esempio:

             <EditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"                   
                android:hint="Username"
                android:inputType="number"                   
                android:textColor="#fff" />

            <view
                android:layout_width="match_parent"
                android:layout_height="1dp"
                android:background="#f9d7db" />

controlla anche e prova a cambiare per prova ed errore android: inputType = "number" in android: inputType = "text" o meglio non usarlo se non richiesto. A volte la tastiera è bloccata e si verifica un errore in alcuni dei dispositivi.


0

Nel mio caso, i campi EditText con inputType come text / textCapCharacters contenevano questo errore. Ho notato questo nel mio logcat ogni volta che ho usato backspace per rimuovere completamente il testo digitato in uno di questi campi.

La soluzione che ha funzionato per me è stata quella di cambiare inputType di quei campi in textNoSuggestions in quanto questo era il tipo più adatto e non mi dava più alcun errore indesiderato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.