Android - zakresy SPAN_EXCLUSIVE_EXCLUSIVE nie mogą mieć zerowej długości

190

Mam następujący układ (praktycznie pusty):

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

Klasa Activity zawiera następujące elementy:

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

Po uruchomieniu tego na urządzeniu mobilnym pojawia się następujący błąd:

SpannableStringBuilder
SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length

Próbowałem tego z TextView i bez niego, a błąd nadal występuje, muszę robić coś zasadniczo nie tak, aby taki podstawowy układ mógł to spowodować.

Czy ktoś ma jakieś pomysły na to, jak mogę to załadować bez błędu?

DMac
źródło
Sprawdź LogCat i spójrz na ślad stosu związany z błędem. Jeśli rzeczywiście pochodzi z tej aplikacji, opublikuj cały ślad stosu jako edycję swojego pytania. Również chciałbym pozbyć się android:contentDescriptionz LinearLayout, jak to pojemnik nie jest aktywowana, a więc opis nie zostaną wykorzystane AFAIK.
CommonsWare,
6
Dzięki za twoją odpowiedź. Niestety nie ma śladu stosu dla tego błędu, dane wyjściowe są dokładnie takie, jak napisałem powyżej, ale pole aplikacji w LogCat wskazuje moją aplikację. Debugowałem kod i przeszedłem przez każdą linię bez zgłaszania błędu, więc musi być gdzieś w kodzie Androida, który oczekuje czegoś, czego nie ma.
DMac,
Chciałbym również wiedzieć, jak uniknąć tego irytującego błędu, bez usuwania / wyłączania jakiejkolwiek funkcji dla użytkownika końcowego.
programista Androida
1
Zresetujełem telefon do ustawień fabrycznych i zniknął, po wypróbowaniu „naprawy klawiatury samsung”, która nie wydawała mi się skuteczna ...
Shark
Być może wcale nie jest to problem, ale po aktualizacji do Androida 4.1.1 widzę wiele błędów w dziennikach takich jak ten. Zakresy SPAN_EXCLUSIVE_EXCLUSIVE nie mogą mieć zerowej długości
Sagar Raiyani,

Odpowiedzi:

241

Natrafiłem na te same wpisy błędów w LogCat. W moim przypadku jest to spowodowane klawiaturą innej firmy, której używam. Kiedy zmienię go z powrotem na klawiaturę Androida, wpis błędu nie będzie już wyświetlany.

Jacek
źródło
3
dzięki @Rabi, nawet przełączyłem się na swiftkey i zacząłem otrzymywać błąd.
Maulik Sheth,
2
Pojawia się błąd podczas używania standardowej klawiatury Androida na Nexusie 7 (edycja 2012, wersja 4.3)
Tom
(W Galaxy S4, 4.4.2) - Przełączenie z powrotem na standardową klawiaturę samsung naprawiło to dla mnie. Dziękuję Ci!
FateNuller
6
Niestety powyższy link @Rabi nie jest już dobry. Ale dziękuję za to. Rzeczywiście używam SwiftKey i wydaje się, że nadal powoduje ten problem 2 lata później.
Splaktar
1
Ten problem pojawia się również w Gboard (!) (I pochodzi z Google)
Aenadon,
113

Ponieważ błąd dostajesz jest nie powiązany z EditText, to jest to nie związane z klawiatury.

Błędy, które otrzymujesz, nie są wynikiem twojego kodu; prawdopodobnie testujesz na urządzeniu Samsung, które ma TouchWiz firmy Samsung.

Miałem te same błędy, potem testowałem na Nexusie S (również przez Samsunga, ale czysty system operacyjny Android bez TouchWiz) i nie dostałem tego błędu.

Więc w twoim przypadku po prostu zignoruj ​​te błędy podczas testowania na urządzeniu! :)

Karim
źródło
1
To twoja klawiatura, prawdopodobnie w twoim przypadku klawiatura TouchWiz. Mam te same błędy na Nexusie 4 ze Swiftkey, jeśli wybiorę domyślną klawiaturę Androida, błędy znikną.
Dante
Klawiatury z pewnością mogą prowadzić do tego błędu, ale w przypadku, gdy klawiatura nie jest używana ani wywoływana, tj. W przypadku, gdy nie ma EditText, nie widzę, jak klawiatura może być źródłem problemu. Kiedy przełączam się między dwoma różnymi działaniami, oba bez EditText, błąd pojawia się za każdym razem, gdy przechodzę do jednego z tych działań.
Karim
2
Zgadzam się z Cookiki, błędy są spowodowane przez Samsung TouchWiz i nie powoduje żadnych problemów innych niż błędy wypluwania w logcat. Więc ich
zignoruję
Nie możemy po prostu zignorować błędów, ponieważ zdarza się to tylko na TouchWiz, najmniej zgłasza samsungowi, że jest problem z touchwiz.
Sojurn
1
Z pewnością mogę wystąpić bez powiązania z tekstem edycji. Miałem ten błąd podczas wyświetlania PreferenceFragment z niektórymi nagłówkami - bez pól tekstowych lub czegoś w tym rodzaju. Przy każdej zmianie z jednej PreferenceFragment dostaję dwa takie komunikaty o błędach. Przełączono z „Samsung Keyboard” na „Smart Keyboard Pro” i komunikaty o błędach zostały zatrzymane.
Magnus W
46

Patrząc na twój kod, nie jestem pewien, dlaczego pojawia się ten błąd, ale miałem ten sam błąd, ale z polami EditText.

Zmiana android:inputType="text"(lub dowolna inna odmiana tekstu inputType) na android:inputType="textNoSuggestions"(lubandroid:inputType="textEmailAddress|textNoSuggestions" , na przykład) naprawiła to dla mnie.

Możesz również ustawić to w Code za pomocą czegoś takiego

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

Wygląda na to, że Android domyślnie zakłada, że ​​pola EditText będą zawierały sugestie. Kiedy tego nie robią, popełnia błędy. Nie jestem w 100% pewien tego wyjaśnienia, ale powyższe zmiany mnie naprawiły.

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

Mam nadzieję że to pomoże!

tim
źródło
Dzięki za to. Ale nawet po usunięciu TextView i tylko obecnym układzie pojawia się błąd. To jest bardzo dziwne.
DMac,
Usunięcie contentDescription z LinearLayout nie pomaga?
tim
2
Nie, niestety nie. Chociaż przy dalszym dochodzeniu błąd wydaje się wyświetlać tylko na urządzeniach Samsung.
DMac,
14

Na telefonie z Androidem przejdź do:
Ustawienia -> Menedżer aplikacji -> Wszystkie -> Klawiatura Samsung, a następnie kliknij „Wyczyść pamięć podręczną”
(usuń wszystkie dane zebrane przez tę aplikację).

Gwiazdy
źródło
Wow, miałem 68 MB rzeczy buforowanych przez tę aplikację. : O
XåpplI'-I0llwlg'I -
11

Spróbuj użyć domyślnej klawiatury Androida, która zniknie

Yasin Hassanien
źródło
jak korzystać z domyślnej klawiatury.
NagarjunaReddy
1
Musisz to zmienić w ustawieniach telefonu. Jeśli go nie zmieniłeś, powinieneś mieć domyślną klawiaturę. To dość zabawne rozwiązanie z tą domyślną klawiaturą, ale działa dla mnie ..: p
Krystian
4
Problem ma też domyślna klawiatura Androida (mam ją na Nexusie 5)
Yoann Hercouet,
4

Wyjaśnij, że przekazałeś wartość w MainAcitivity dla następujących metod onCreateOptionsMenu i onCreate

W niektórych przypadkach programista usuwa instrukcję „return super.onCreateOptionsMenu (menu)” i zmienia się na „return true”.

Masood Moshref
źródło
3

To działało dla mnie ... na każdym urządzeniu

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

W kodzie 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;
        }
    });
Rahul Nehul
źródło
Dzięki. Działa jak urok
swapnil gandhi
wydaje się, że słuchacz jest koniecznością
AndroidHV
Witajcie przyjaciele, na moim ekranie nie używaj żadnego edytowania tekstu, używaj tylko układu liniowego i przycisku. Napotykam ten sam problem po uruchomieniu aplikacji na tablecie (4.1.2).
Hardik
1

Miałem to samo ostrzeżenie i stwierdziłem, że usunięcie nieużywanego @id pozbyło się ostrzeżenia. Dla mnie było to oczywiste, ponieważ @id był powiązany z rosnącą listą textViews powiązanych z bazą danych, więc dla każdego wpisu było ostrzeżenie.

rozpoznać
źródło
1

Masood Moshref ma rację, ten błąd występuje, ponieważ menu opcji Menu nie jest dobrze przygotowane przez brak metody „return super.onCreateOptionsMenu (menu)” w metodzie onCreate ().

hqgoldswan
źródło
1

Aby spróbować debugować ten błąd, najpierw przejdź do terminala / konsoli Androida i wykonaj następujące polecenie:

ps | grep THE_ERROR_PID_YOU_GET_(IT_IS_A_NUMBER)

to jeśli wyjście wyjdzie jako twoja aplikacja ... to twoja aplikacja powoduje błąd. Spróbuj poszukać pustych Strings, które przejdziesz dolayout .

Miałem dokładnie ten sam problem i to moja wina, że ​​wprowadzałem puste Stringdo mojego układu. Po zmianie ""na" " tego błędu odszedł.

Jeśli nie otrzymujesz aplikacji z wyjścia konsoli, przyczyną jest inna przyczyna (prawdopodobnie, jak powiedzieli inni, klawiatura Androida)

dazito
źródło
0

Napotkałem ten sam problem. Prawie zmarnowałem prawie kilka tygodni na rozwiązanie tego problemu. Wreszcie miałem wątpliwości co do siebie i próbowałem stworzyć inny projekt, kopiując i wklejając niektóre pliki startowe, takie jak SplashScreen i LoginScreen.

Ale wciąż z tym samym kodem otrzymywałem SPAN_EXCLUSIVE_EXCLUSIVE .

Następnie usunąłem kod obsługi z ekranu powitalnego i spróbowałem ponownie i Wow działa. Nie otrzymuję problemu SPAN_EXCLUSIVE_EXCLUSIVE w logcat .

Zastanawiam się, dlaczego tak jest? dopóki czas nie znalazł innego rozwiązania, ale po usunięciu programu obsługi z ekranu powitalnego działa.

Spróbuj zaktualizować tutaj, jeśli problem został rozwiązany, czy nie.

Sachin Shelke
źródło
0

Sprawdź, czy jakikolwiek element, taki jak przycisk lub widok tekstu, jest zduplikowany (skopiowany dwukrotnie) na ekranie, na którym się to pojawia. Zrobiłem to niezauważony i musiałem zmierzyć się z tym samym problemem.

Dibyendu Mitra Roy
źródło
0

Na ten problem też wpadłem, gdy skopiowałem jakiś tekst z Internetu. Moim rozwiązaniem jest przycięcie tekstu / usunięcie formatowania przed dalszym przetwarzaniem.

kodowanie
źródło
0

Miałem ten sam problem, ale z listView .... rozwiązałem go, ponieważ użyłem niewłaściwego R.id.listView tej listy Widok musiał mieć wartość, w moim przypadku były to ciągi znaków, które zapisałem na listView2 ... więc właściwy kod to R.id.listView2

Andrey
źródło
0

Miałem ten sam problem, a następnie naprawiłem go, wykonując kod!

  text = (EditText)findViewById(R.id.TextVoiceeditText); 
  text.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
Shahzad Afridi
źródło
0

ten błąd występuje również z powodu zmienionego adresu URL interfejsu API. spróbuj użyć adresu URL, którego używasz w listonoszu ic, jeśli działa poprawnie. ponowne sprawdzenie interfejsów API rozwiązało mój problem

Aditya Dabas
źródło
0

staraj się unikać użycia widoku w projekcie xml. Ja też miałem ten sam problem, ale kiedy usunąłem widok. działało idealnie.

jak przykład:

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

sprawdź także i spróbuj zmienić metodą prób i błędów android: inputType = "number" na android: inputType = "text" lub lepiej nie używaj go, jeśli nie jest wymagany. Czasami klawiatura zacina się i pojawia się błąd na niektórych urządzeniach.

Eshan Chattaraj
źródło
0

W moim przypadku pola EditText z inputType jako text / textCapCharacters ten błąd. Zauważyłem to w moim logcat za każdym razem, gdy użyłem backspace, aby całkowicie usunąć tekst wpisany w dowolnym z tych pól.

Rozwiązaniem, które działało dla mnie, była zmiana typu inputType tych pól na textNoSuggestions, ponieważ był to najbardziej odpowiedni typ i nie powodował już żadnych niepożądanych błędów.

Ankush Chauhan
źródło