Android - SPAN_EXCLUSIVE_EXCLUSIVE прольоти не можуть мати нульову довжину


190

У мене є такий макет (практично порожній):

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

Клас активності містить:

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

Коли я запускаю це на своєму мобільному пристрої, я отримую таку помилку:

SpannableStringBuilder
SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length

Я спробував це з TextView і без неї, і все ще залишається помилка, я повинен робити щось принципово неправильно, щоб такий базовий макет викликав це.

Хтось має ідеї, як я можу змусити це завантажуватись без помилки?


Вивчіть LogCat і перегляньте слід стека, пов'язаний з вашою помилкою. Якщо це дійсно з цього додатка, опублікуйте весь слід стека як редагування вашого питання. Крім того , я хотів би позбутися від android:contentDescriptionвід LinearLayout, так що контейнери не фокусируемое і тому опис не використовуватиметься AFAIK.
CommonsWare

6
Дякую за Вашу відповідь. На жаль, для цієї помилки не існує сліду стека, вихід точно такий, як я розмістив вище, але поле програми в LogCat вказує на мою програму. Я налагодив код і переступив кожен рядок, не помиляючись, тому він повинен бути десь у коді Android, який очікує чогось там, де його немає.
DMac

Мені хотілося б знати, як уникнути цієї прикрої помилки, не видаляючи / відключаючи будь-яку функцію для кінцевого користувача.
андроїд розробник

1
Я скинув телефон до заводських налаштувань, і він пішов, після спробу "виправити клавіатуру Samsung", яка, схоже, не зробила для мене хитрості ...
Shark

Можливо, це зовсім не проблема, але після оновлення до Android 4.1.1 я бачу багато помилок у журналах, як цей. SPAN_EXCLUSIVE_EXCLUSIVE прольоти не можуть мати нульову довжину
Sagar Raiyani

Відповіді:


241

Я зіткнувся з тими ж записами про помилки в LogCat. У моєму випадку це викликано сторонньою клавіатурою, яку я використовую. Коли я повертаю його назад на клавіатуру Android, запис про помилку більше не з’являється.


3
дякую @Rabi, навіть я перейшов на swiftkey і почав отримувати помилку.
Маулік Шет

2
Я отримую помилку під час користування клавіатурою Android на Nexus 7 (видання 2012 року, версія 4.3)
Том

(На Galaxy S4, 4.4.2) - Переключення на клавіатуру samsung для мене виправлено. Дякую!
FateNuller

6
На жаль, посилання від @Rabi вище вже не добре. Але дякую за це. Я дійсно використовую SwiftKey, і, здається, це все ще викликає це питання через 2 роки.
Splaktar

1
Ця проблема з’являється і в Gboard (!) (І це від Google)
Енадон

113

Оскільки помилка, яку ви отримуєте, не пов'язана з помилкою EditText, вона не пов’язана з вашою клавіатурою.

Помилки, які ви отримуєте, не є результатом вашого коду; ви, ймовірно, випробовуєте на пристрої Samsung, який має TouchWiz Samsung.

У мене були ті ж помилки, тоді я тестував Nexus S (також Samsung, але чисту ОС Android без TouchWiz), і я не отримав цю помилку.

Тож у вашому випадку просто ігноруйте ці помилки під час тестування на пристрої! :)


1
Це ваша клавіатура, можливо, клавіатура TouchWiz у вашому випадку. У мене однакові помилки на Nexus 4 із Swiftkey, якщо я вибираю клавіатуру Android за замовчуванням, помилки не будуть.
Данте

Клавіатури, безумовно, можуть призвести до цієї помилки, але у випадку, коли клавіатура не використовується та не викликається, тобто у випадку, коли немає EditText, я не бачу, як саме клавіатура може бути джерелом проблеми. Коли я перемикаюся між двома різними видами діяльності, без обох EditText, я постійно отримую помилку щоразу, коли переходжу до одного з цих дій.
Карим

2
Я погоджуюся з Cookiki, помилки пов’язані з Samsung TouchWiz, і це не спричиняє жодних проблем, крім помилок випробовування в logcat. Тож буде ігнорувати їх
user2566490

Ми не можемо просто ігнорувати помилки, оскільки це відбувається лише на TouchWiz, найменше - це повідомлення Samsung, що існує проблема з сенсорним візком.
Соджурна

1
Я, безумовно, може статися без того, щоб він був пов'язаний з EditText. У мене виникла помилка під час відображення PreferenceFragment з деякими заголовками - без текстових полів чи нічого подібного. При кожній зміні одного PreferenceFragment я отримав два таких повідомлення про помилки. Перемкнено з "Клавіатури Samsung" на "Smart Keyboard Pro", і повідомлення про помилку припинилося.
Magnus W

46

Дивлячись на ваш код, я не впевнений, чому ви отримуєте цю помилку, але у мене була така сама помилка, але з полями EditText.

Змінення android:inputType="text"(або будь-якого з інших варіантів тексту inputType) на android:inputType="textNoSuggestions"(або android:inputType="textEmailAddress|textNoSuggestions", наприклад) виправлено це для мене.

Ви також можете встановити це в Кодексі з чимось подібним

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

Схоже, Android за замовчуванням передбачає, що поля EditText матимуть пропозиції. Коли вони цього не роблять, вони помиляються. Не на 100% впевнений у цьому поясненні, але вищезгадані зміни зафіксували це для мене.

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

Сподіваюся, це допомагає!


Дякую за це Але навіть з видаленим TextView і тільки наявна компоновка, я отримую помилку. Це дуже дивно.
DMac

Видалення contentDescription з LinearLayout не допоможе?
час

2
Ні, на жаль, ні. Хоча при подальшому дослідженні помилка, здається, відображається лише на пристроях Samsung.
DMac

14

На телефоні Android виберіть:
налаштування -> диспетчер програм -> все -> клавіатура Samsung і натисніть кнопку "очистити кеш"
(видаліть усі дані, зібрані цим додатком).


Нічого, у мене було 68 Мб матеріалів, кешованих цим додатком. : O
XåpplI'-I0llwlg'I -

11

Спробуйте скористатися клавіатурою Android за замовчуванням, вона зникне


Як користуватися клавіатурою за замовчуванням.
NagarjunaReddy

1
Це потрібно змінити в налаштуваннях вводу телефону. Якщо ви її не змінили, у вас повинна бути клавіатура за замовчуванням. Це досить кумедне рішення з цією клавіатурою за замовчуванням, але вона працює для мене ..: p
Krystian

4
Клавіатура Android за замовчуванням також має проблему (у мене вона є на Nexus 5)
Йоанн Херкует

4

Уявіть, що ви пройшли значення у своїй MainAcibility для наступних методів onCreateOptionsMenu та onCreate

У деяких випадках розробник видаляє оператор "return super.onCreateOptionsMenu (menu)" і змінює на "return true".


3

Це працювало для мене ... на кожному пристрої

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

У коді 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;
        }
    });

Дякую. Працював як шарм
swapnil gandhi

здається, що слухача обов'язково
AndroidHV

Привіт друзі, на моєму екрані не використовуйте жодного редагування тексту, використовуйте лише лінійний макет та кнопку. Я зіткнувся з тією ж проблемою, коли запускаю додаток на планшеті (4.1.2).
Хардік

1

У мене було таке ж попередження і було встановлено, що видалення невикористаного @id позбулося попередження. Для мене це було очевидно, оскільки @id асоціювався зі зростаючим списком textViews, пов’язаним із базою даних, тому для кожного запису було попередження.


1

Масуд Мошреф має рацію, ця помилка виникає через те, що опція меню Меню недостатньо підготовлена ​​відсутністю методу "повернути super.onCreateOptionsMenu (меню)" в onCreate ().


1

Щоб спробувати налагодити цю помилку, спершу перейдіть до свого Android-терміналу / консолі та виконайте цю команду:

ps | grep THE_ERROR_PID_YOU_GET_(IT_IS_A_NUMBER)

то якщо результат виходить як ваш додаток ... це ваша програма викликає помилку. Спробуйте шукати порожнє, Stringsяке ви переходите вlayout .

У мене була така ж проблема, і я був з моєї вини, коли я пропускав порожнє Stringв свою макет. Після зміни ""на " "цю помилку пішла.

Якщо ви не отримуєте свою програму з консольного виходу, то це спричиняє щось інше (можливо, як казали інші, клавіатура андроїда)


0

Я зіткнувся з тим же питанням. Я вирішив це питання майже пару тижнів. Нарешті я мав сумніви в собі і спробував створити інший проект, скопіювавши та вставивши кілька файлів запуску, таких як SplashScreen & LoginScreen.

Але з тим самим кодом я все-таки отримував SPAN_EXCLUSIVE_EXCLUSIVE .

Тоді я видалив код обробника з екрану заставки і спробував ще раз і нічого не працював. У мене не виникає проблема SPAN_EXCLUSIVE_EXCLUSIVE у logcat .

Цікаво, чому це? до тих пір, поки не знайшло жодного іншого рішення, але, видаливши обробник із екрана заставки, він працює.

Спробуйте і оновіть тут, якщо це вирішено чи ні.


0

Перевірте, чи є у вас будь-який елемент, такий як перегляд кнопки чи тексту, дубльований (скопійований двічі) на екрані, де це зустрічається. Я зробив це непомітно і довелося зіткнутися з тим же питанням.


0

Я також зіткнувся з цією проблемою, коли скопіював якийсь текст з Інтернету. Моє рішення - обрізати текст / видалити форматування, перш ніж робити подальшу обробку.


0

У мене була така ж проблема, але з listView .... я вирішив її, тому що я використовував неправильний R.id.listView, що перегляд списку потрібен, щоб мати значення, у моєму випадку це були рядки, які я зберег у listView2 ... тому правильним кодом був R.id.listView2


0

У мене була така ж проблема, то я її виправив за допомогою наступного коду!

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

0

ця помилка також виникає через змінену URL-адресу API. спробуйте потрапити на URL-адресу, яку ви використовуєте у листоноші та c, якщо вона працює належним чином. повторна перевірка API вирішила мою проблему


0

спробуйте уникати використання view в xml дизайні. Я теж мав таку ж проблему, але коли я видалив подання. це працювало чудово.

як приклад:

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

також перевірте і спробуйте змінити методом проб і помилок android: inputType = "число" на android: inputType = "текст" або краще не використовувати його, якщо не потрібно. Іноді клавіатура застрягла і отримує помилку на деяких пристроях.


0

У моєму випадку поля EditText з inputType як text / textCapCharacters цю помилку. Я помічав це у своїй лог-коті всякий раз, коли я використовував backspace для повного видалення тексту, введеного в будь-якому з цих полів.

Для мене працювало рішення змінити вхідний тип цих полів на textNoSuggesitions, оскільки це був найбільш підходящий тип і більше не давав мені небажаних помилок.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.