Android - os spans de SPAN_EXCLUSIVE_EXCLUSIVE não podem ter tamanho zero


190

Eu tenho o seguinte layout (praticamente vazio):

<?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>

A classe Activity contém o seguinte:

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

Quando executo isso no meu dispositivo móvel, recebo o seguinte erro:

SpannableStringBuilder
SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length

Eu tentei isso com e sem o TextView e o erro ainda permanece, devo estar fazendo algo fundamentalmente errado para que um layout tão básico cause isso.

Alguém tem alguma idéia de como posso fazer isso carregar sem o erro?


Examine o LogCat e observe o rastreamento de pilha associado ao seu erro. Se realmente for desse aplicativo, publique todo o rastreamento da pilha como uma edição na sua pergunta. Além disso, gostaria se livrar android:contentDescriptionde LinearLayout, como o recipiente não é focusable e, portanto, a descrição não será usado AFAIK.
CommonsWare

6
Obrigado pela sua resposta. Infelizmente, não há rastreamento de pilha para esse erro, a saída é exatamente como eu postei acima, mas o campo do aplicativo no LogCat aponta para o meu aplicativo. Eu depurei o código e passei por cada linha sem que nenhum erro fosse gerado; portanto, ele deve estar em algum lugar no código do Android que espera algo que não existe.
dmac

Gostaria de saber como evitar esse erro irritante também, sem remover / desativar qualquer recurso para o usuário final.
desenvolvedor android

1
Eu redefinir o telefone para as configurações de fábrica e ele foi embora, depois de tentar o 'samsung correção teclado' que não parecem fazer o truque para mim ...
tubarão

Talvez não seja um problema, mas após a atualização para o Android 4.1.1, estou vendo muitos erros nos logs como este. Vãos SPAN_EXCLUSIVE_EXCLUSIVE não pode ter um comprimento zero
Sagar Raiyani

Respostas:


240

Eu encontrei as mesmas entradas de erro no LogCat. No meu caso, é causado pelo teclado de terceiros que estou usando. Quando eu mudo de volta para o teclado Android, a entrada de erro não aparece mais.


3
obrigado @Rabi, mesmo eu mudei para swiftkey e comecei a receber o erro.
Maulik Sheth

2
Eu recebo o erro ao usar o teclado Android padrão em um Nexus 7 (edição de 2012, executando 4.3) #
7602 Tom

(No Galaxy S4, 4.4.2) - Voltar ao teclado samsung padrão corrigiu isso para mim. Obrigado!
FateNuller 13/09/14

6
Infelizmente, o link do @Rabi acima não é mais bom. Mas obrigado por isso. De fato, estou usando o SwiftKey e parece que ainda está causando esse problema 2 anos depois.
Splaktar 22/11

1
Esse problema também aparece no Gboard (!) (E é do Google)
Aenadon

113

Porque o erro que você está recebendo é não relacionado a um EditText, então é não relacionado com o seu teclado.

Os erros que você está recebendo não são resultado do seu código; você provavelmente está testando em um dispositivo Samsung que possui o TouchWiz da Samsung.

Eu tive os mesmos erros, testei em um Nexus S (também da Samsung, mas puro Android OS sem TouchWiz) e não recebi esse erro.

Portanto, no seu caso, ignore esses erros enquanto estiver testando em um dispositivo! :)


1
É o seu teclado, provavelmente o teclado do TouchWiz no seu caso. Tenho os mesmos erros em um Nexus 4 com Swiftkey. Se eu escolher o teclado Android padrão, os erros desaparecerão.
Dante

Os teclados podem definitivamente levar a esse erro, mas no caso em que o teclado não é usado ou chamado, ou seja, no caso em que não há EditText, não vejo como o teclado pode ser a fonte do problema. Quando alterno entre duas atividades diferentes, ambas sem o EditText, continuo recebendo o erro toda vez que vou a uma dessas atividades.
Karim

2
Concordo com o Cookiki, os erros são causados ​​pelo Samsung TouchWiz e não causam problemas além de vomitar erros no logcat. Assim será ignorá-los
user2566490

Não podemos simplesmente ignorar erros, porque isso acontece apenas em um TouchWiz, o mínimo é informar à Samsung que há um problema com o touchwiz.
sojurn

1
Certamente posso ocorrer sem estar relacionado a um EditText. Eu tive esse erro ao exibir um PreferenceFragment com alguns cabeçalhos - sem caixas de texto ou qualquer coisa do tipo. Em cada alteração de um PreferenceFragment, recebi duas dessas mensagens de erro. Mudou de "Samsung Keyboard" para "Smart Keyboard Pro" e as mensagens de erro foram interrompidas.
Magnus W

46

Olhando para o seu código, não sei por que você está recebendo esse erro, mas tive o mesmo erro, mas com os campos EditText.

Alterar android:inputType="text"(ou qualquer outra variação de texto inputType) para android:inputType="textNoSuggestions"(ou android:inputType="textEmailAddress|textNoSuggestions", por exemplo) corrigiu isso para mim.

Você também pode definir isso no Code com algo como

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

Parece que o Android assume por padrão que os campos EditText terão sugestões. Quando não o fazem, erros. Não estou 100% confiante nessa explicação, mas as alterações acima mencionadas o corrigiram.

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

Espero que isto ajude!


Obrigado por isso. Mas mesmo com o TextView removido e apenas o layout presente, recebo o erro. É muito estranho.
dmac

Remover o contentDescription do LinearLayout não ajuda?
tim

2
Não, infelizmente não. Embora com uma investigação mais aprofundada, o erro pareça ser exibido apenas nos dispositivos Samsung.
dmac

14

No seu telefone Android, vá para:
configurações -> gerenciador de aplicativos -> tudo -> teclado samsung e clique em "limpar cache"
(exclua todos os dados coletados por este aplicativo).


Uau, eu tinha 68 MB de material armazenado em cache por esse aplicativo. : O
XåpplI'-I0llwlg'I -

11

Tente usar o teclado Android padrão, ele desaparecerá


como usar o teclado padrão.
precisa

1
Você precisa alterá-lo nas configurações de entrada do telefone. Se você não o alterou, deverá ter o teclado padrão. É solução muito engraçado com que o teclado padrão, mas funciona para mim ..: p
Krystian

4
O padrão do teclado Android também tem o problema (eu tê-lo em um Nexus 5)
Yoann Hercouet

4

Deixe claro que você passou um valor em sua MainAcitivity para os seguintes métodos onCreateOptionsMenu e onCreate

Em alguns casos, o desenvolvedor exclui a instrução "return super.onCreateOptionsMenu (menu)" e mudou para "return true".


3

Isso funcionou para mim ... em todos os dispositivos

    <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"
        />

No código 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;
        }
    });

Obrigado. Trabalhou como charme
swapnil gandhi

parece ter um ouvinte é uma obrigação
AndroidHV

Olá amigos, na minha tela não use nenhum texto Editar, use apenas o layout linear e o botão.Eu enfrento o mesmo problema quando executo o aplicativo no tablet (4.1.2).
Hardik

1

Tive o mesmo aviso e descobri que a remoção de um @id não utilizado se livrou do aviso. Para mim, era óbvio que o @id estava associado a uma lista crescente de visualizações de texto vinculadas a um banco de dados; portanto, havia um aviso para cada entrada.


1

Masood Moshref está certo, esse erro ocorre porque o menu de opções do Menu não está bem preparado por falta de "return super.onCreateOptionsMenu (menu)" no método onCreate ().


1

Para tentar depurar esse erro, primeiro vá ao seu terminal / console do Android e execute este comando:

ps | grep THE_ERROR_PID_YOU_GET_(IT_IS_A_NUMBER)

se a saída sair como seu aplicativo ... é seu aplicativo que está causando o erro. Tente procurar o vazio Stringsque você passa para o layout.

Eu tive exatamente o mesmo problema e a culpa foi minha, pois estava passando um espaço vazio Stringno meu layout. Depois de mudar ""para " "este erro foi embora.

Se você não obtiver seu aplicativo da saída do console, isso causará outra coisa (provavelmente, como outros disseram, o teclado do Android)


0

Eu enfrentei o mesmo problema. Quase perdi quase duas semanas para resolver esse problema. Por fim, fiquei com dúvidas e tentei criar outro projeto copiando e colando alguns arquivos de inicialização como o SplashScreen & LoginScreen.

Mas com o mesmo código ainda estava recebendo SPAN_EXCLUSIVE_EXCLUSIVE .

Em seguida, removi o código do manipulador da tela inicial e tentei novamente e o Wow está funcionando. Não estou recebendo o problema SPAN_EXCLUSIVE_EXCLUSIVE no logcat .

Eu me pergunto, por que é? até o momento não ter outra solução, mas removendo o manipulador da tela inicial, ele está funcionando.

Tente atualizar aqui se for resolvido ou não.


0

Verifique se há algum elemento, como botão ou exibição de texto, duplicado (copiado duas vezes) na tela em que isso ocorre. Eu fiz isso despercebido e tive que enfrentar o mesmo problema.


0

Também tive esse problema quando copiei algum texto da Internet. Minha solução é aparar o texto / remover a formatação antes de fazer qualquer outro processamento.


0

Eu tive o mesmo problema, mas com um listView .... eu o resolvi porque estava usando um R.id.listView errado nessa exibição de lista necessária para ter um valor, no meu caso, foram as cordas que salvei no listView2 ... então o código certo era R.id.listView2


0

Eu tive o mesmo problema, então eu o corrigi seguindo o código!

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

0

esse erro também ocorre devido à alteração do URL da API. tente acessar a URL que você está usando no carteiro ec se estiver funcionando corretamente. verificar novamente as APIs resolveu meu problema


0

tente evitar o uso da visualização no design xml.Também tive o mesmo problema, mas quando removi a view. funcionou perfeitamente.

como exemplo:

             <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" />

também verifique e tente alterar por tentativa e erro android: inputType = "number" para android: inputType = "text" ou melhor, não o utilize, se não for necessário. Às vezes, o teclado fica preso e ocorre um erro em alguns dos dispositivos.


0

No meu caso, os campos EditText com inputType como text / textCapCharacters estavam apresentando esse erro. Notei isso no meu logcat sempre que usei o backspace para remover completamente o texto digitado em qualquer um desses campos.

A solução que funcionou para mim foi alterar o inputType desses campos para textNoSuggestions, pois esse era o tipo mais adequado e não me causava mais erros indesejados.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.