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>

Класс Activity содержит следующее:

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

Я хотел бы знать, как избежать этой надоедливой ошибки, не удаляя и не отключая какую-либо функцию для конечного пользователя.
Android-разработчик

1
Я сбросил телефон к заводским настройкам, и он ушел, попробовав «исправление клавиатуры samsung», которое, похоже, не помогло мне ...
Shark

Возможно, это совсем не проблема, но после обновления до Android 4.1.1 я вижу много ошибок в журналах, подобных этой. SPAN_EXCLUSIVE_EXCLUSIVE промежутки не могут иметь нулевую длину
Сагар Райяни

Ответы:


241

Я столкнулся с той же записи ошибок в LogCat. В моем случае это вызвано тем, что я использую стороннюю клавиатуру. Когда я переключаю его обратно на клавиатуру Android, запись об ошибке больше не отображается.


3
спасибо @Rabi, даже я переключился на swiftkey и начал получать ошибку.
Маулик Шет

2
Я получаю сообщение об ошибке при использовании штатной клавиатуры Android на Nexus 7 (выпуск 2012 г., версия 4.3)
Tom

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

6
К сожалению, ссылка с @Rabi выше не годится. Но спасибо тебе за это. Я действительно использую SwiftKey, и это, кажется, все еще вызывает эту проблему 2 года спустя.
Сплактар

1
Эта проблема появляется и с Gboard (!) (И это от Google)
Aenadon

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, что есть проблема с TouchWiz.
Сожурн

1
Я вполне могу произойти без того, чтобы это было связано с EditText. У меня была эта ошибка при отображении PreferenceFragment с некоторыми заголовками - без текстовых полей или чего-либо в этом роде. При каждом изменении одного PreferenceFragment я получал два таких сообщения об ошибках. Переключился с «Samsung Keyboard» на «Smart Keyboard Pro» и сообщения об ошибках прекратились.
Магнус 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, она исчезнет


как использовать клавиатуру по умолчанию.
НагарджунаРедди

1
Вы должны изменить это в настройках входа телефона. Если вы не меняли его, у вас должна быть клавиатура по умолчанию. Это довольно забавное решение с этой клавиатурой по умолчанию, но оно работает для меня ..: p
Кристиан

4
Клавиатура Android по умолчанию также имеет проблему (у меня она есть на Nexus 5)
Йоанн Херкуэ

4

Убедитесь, что вы передали значение в MainAcitivity для следующих методов onCreateOptionsMenu и onCreate

В некоторых случаях разработчик удаляет оператор return super.onCreateOptionsMenu (menu) и заменяет его на 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;
        }
    });

Спасибо. Работал как шарм
свапни Ганди

кажется, что наличие слушателя является обязательным
AndroidHV

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

1

Я получил то же самое предупреждение и обнаружил, что удаление неиспользованного @id избавилось от предупреждения. Для меня это было очевидно, так как @id ассоциировался с растущим списком текстовых представлений, связанных с базой данных, поэтому для каждой записи было предупреждение.


1

Масуд Мошреф прав, эта ошибка возникает из-за того, что меню параметров меню недостаточно хорошо подготовлено из-за отсутствия метода return super.onCreateOptionsMenu (menu) в методе onCreate ().


1

Чтобы попытаться отладить эту ошибку, сначала перейдите на ваш терминал / консоль android и выполните эту команду:

ps | grep THE_ERROR_PID_YOU_GET_(IT_IS_A_NUMBER)

затем, если вывод выходит как ваше приложение ... это ваше приложение вызывает ошибку. Попробуйте поискать пустое, Stringsкоторое вы передаете вlayout .

У меня была точно такая же проблема, и это была моя вина, когда я передавал пустую Stringв свой макет. После изменения ""в" " этом ошибки ушел.

Если ваше приложение не выводится из консоли, то оно вызывается чем-то другим (возможно, как говорили другие, клавиатурой Android)


0

Я столкнулся с той же проблемой. Я почти потратил почти пару недель, чтобы решить эту проблему. Наконец я сомневался в себе и попытался создать другой проект, скопировав и вставив некоторые файлы запуска, такие как SplashScreen & LoginScreen.

Но с тем же кодом я все еще получал SPAN_EXCLUSIVE_EXCLUSIVE .

Затем я удалил код обработчика с заставки и попробовал еще раз, и ничего себе. Я не получаю SPAN_EXCLUSIVE_EXCLUSIVE проблему в logcat .

Мне интересно, почему это так? пока время не получило никакого другого решения, но, удалив обработчик с заставки, он работает.

Попробуйте обновить здесь, если это решено или нет.


0

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


0

Я тоже столкнулся с этой проблемой, когда скопировал текст из Интернета. Мое решение состоит в том, чтобы обрезать текст / удалить форматирование перед дальнейшей обработкой.


0

У меня была та же проблема, но с listView .... я решил ее, потому что я использовал неправильный R.id.listView, что View списка должен иметь значение, в моем случае это были строки, которые я сохранил в 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 design. У меня тоже была та же проблема, но когда я удалил view. это сработало отлично.

как пример:

             <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 = "number" на android: inputType = "text" или лучше не использовать его, если не требуется. Иногда клавиатура застревает и выдает ошибку на некоторых устройствах.


0

В моем случае поля EditText с inputType как text / textCapCharacters были этой ошибки. Я замечал это в своем logcat всякий раз, когда использовал backspace для полного удаления текста, набранного в любом из этих полей.

Решение, которое работало для меня, состояло в том, чтобы изменить inputType этих полей на textNoSuggestions, так как это был наиболее подходящий тип и больше не давал мне никаких нежелательных ошибок.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.