Подтвердить что ты не робот

GetExtractedText на неактивное предупреждение InputConnection на Android

В моем logcat появляется следующее предупреждение.

getExtractedText on inactive InputConnection

Я не могу найти причину этого. Пожалуйста, помогите

4b9b3361

Ответ 1

У меня возникла аналогичная проблема. Мой логарифм:

W/IInputConnectionWrapper(21214): getTextBeforeCursor on inactive InputConnection
W/IInputConnectionWrapper(21214): getSelectedText on inactive InputConnection
W/IInputConnectionWrapper(21214): getTextBeforeCursor on inactive InputConnection
W/IInputConnectionWrapper(21214): getTextAfterCursor on inactive InputConnection
...
I/Choreographer(20010): Skipped 30 frames!  The application may be doing too much work on its main thread.

Моя ситуация: У меня есть EditText, в который входят типы пользователей. EditText очищается, когда пользователь нажимает кнопку. Когда я быстро нажимаю кнопку, происходит много неактивных записей InputConnection.

Пример:

editText.setText(null);

Последняя строка в моем logcat выше дает отличное представление о том, что происходит. Разумеется, InputConnection перегружен запросами на очистку текста. Я попытался изменить код, чтобы проверить длину текста, прежде чем пытаться его очистить:

if (editText.length() > 0) {
    editText.setText(null);
}

Это помогает смягчить проблему в том, что нажатие кнопки быстро не вызывает поток предупреждений IInputConnectionWrapper. Однако это все еще подвержено проблемам, когда пользователь быстро чередуется между вводом чего-то и нажатием кнопки или нажатием кнопки, когда приложение находится под достаточной нагрузкой и т.д.

К счастью, я нашел другой способ очистить текст: Editable.clear(). С этим я вообще не получаю предупреждений:

if (editText.length() > 0) {
    editText.getText().clear();
}

Обратите внимание, что если вы хотите очистить все входное состояние, а не только текст (autotext, autocap, multitap, undo), вы можете использовать TextKeyListener.clear( Редактируемый e).

if (editText.length() > 0) {
    TextKeyListener.clear(editText.getText());
}

Ответ 2

Обновление:

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

У меня возникла проблема, позвонив:

hiddenKeyboardText.getText().clear();
hiddenKeyboardText.append("some string");

Примечание. Я все равно делаю вызов в обратном вызове afterTextChanged, хотя он работает и без предупреждений от onTextChanged.

Предыдущий ответ:

Я тоже получал одинаковые сообщения в logcat, хотя мой сценарий несколько отличался. Я хотел прочитать каждый символ, который попал в EditText (или скомпонованные символы/вставленный текст), а затем reset рассматриваемый EditText в строку инициализации по умолчанию.

Четкая текстовая часть работает в соответствии с решением Джонсона выше. Однако сброс текста был проблематичным, и я получил предупреждения о подключении.

Первоначально my onTextChanged(CharSequence s, ...) определялся следующим образом:

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
    if (isResettingKeyboard)
        return;

    // ... do what needs to be done

    resetKeyboardString();

}

public void resetKeyboardString()
{
    isResettingKeyboard = true;

    hiddenKeyboardText.getText().clear();
    hiddenKeyboardText.setText(keyboardInitString);
    hiddenKeyboardText.setSelection(defaultKeyboardCursorLocation);

    isResettingKeyboard = false;
}

Когда вызывается onTextChanged(...), EditText находится в режиме readonly. Я не уверен, что это означает, что мы не можем сделать больше, чем называть getText.clear() на нем (setText(...) вызовы также вызывают предупреждения ввода).

Однако обратный вызов afterTextChanged(Editable s) является правильным местом для установки текста.

@Override
public void afterTextChanged(Editable s) {

    if (isResettingKeyboard)
        return;

    resetKeyboardString();

    // ... 
}

Это пока работает без каких-либо предупреждений.

Ответ 3

Из справочных документов

http://developer.android.com/reference/android/view/inputmethod/InputConnection.html

Интерфейс InputConnection является каналом связи с InputMethod возвращается к приложению, которое получает его вход. это используется для выполнения таких вещей, как чтение текста вокруг курсора, ввод текста в текстовое поле и отправка сырых ключевых событий в приложение.

Кроме того, дальнейшее чтение показывает

getExtractedText(): Этот метод может выйти из строя, если входное соединение недействительно (например, сбой процесса), или клиент слишком долго ответьте текстом (ему нужно вернуть пару секунд). В в любом случае возвращается null.

Он также отслеживает изменения в этом тексте и предупреждает изменения.

Чтобы найти проблему, вам нужно будет исследовать любые запросы к базе данных, которые вы делаете, возможно, вокруг listViews или списков в макете.

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

Кроме того, проблема возникает из вашего приложения? или, возможно, кто-то еще, который вы недавно установили. Перечислите полную трассировку logCat. Кто-то может признать проблему.

Я бы поставил под сомнение, что если вы не написали что-то конкретное, то это сообщение о некотором elses log log или, возможно, библиотеке, которую вы используете?

Ответ 4

У меня была такая же проблема. Предупреждение появилось, когда мягкая клавиатура была активирована в одном из моих EditTexts и активность потеряла фокус.

Я сделал, чтобы скрыть клавиатуру в onPause();

@Override
protected void onPause() {

    // hide the keyboard in order to avoid getTextBeforeCursor on inactive InputConnection
    InputMethodManager inputMethodManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);

    inputMethodManager.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);

    super.onPause();
}

Ответ 5

Решил эту проблему для себя, может быть, у вас такая же проблема.

Это вызвано Объектом в HeaderView Адаптер списка.

Я надул Вид и объявил Object и разместил на нем TextWatcher.

View v = LayoutInflater.from(CONTEXT).inflate(R.layout.in_overscrollview, null);
Object= (Object) v.findViewById(R.id.OBJECT_ID);

Object.addTextChangedListener(new TextWatcher() {
        @Override
        public void afterTextChanged(Editable s) {
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after){
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
        //Do my work
        //Update my view
        }
});

Добавил его в Адаптер списка и построил адаптер.

JobListView = (ListView) getListView().findViewWithTag("JOBLISTVIEWTAG");
JobListView.addHeaderView(v, null, false);
JobsAdapter = new IN_JOBS_ADAPTER(CONTEXT, ITEMS_FOR_ADATER);
ListView.setAdapter(JOBSadapter);

Все прекрасно работает Text Watcher.

НО, если я когда-либо перестраивал адаптер после начальной сборки.

JobsAdapter = new IN_JOBS_ADAPTER(CONTEXT, DIFFERENT_ITEMS_FOR_ADAPTER);
ListView.setAdapter(JOBSadapter);

Этот HeaderView также перестроен.

Это предупреждение будет отображаться, потому что объект Объект удален, и текстовый наблюдатель все еще установлен для просмотра.

Адаптер Список и Объект были заменены, и я предполагаю, что Text Watcher смотрел в другую сторону, когда это произошло.

Итак, предупреждение отключается, и чудесным образом Text Watcher находит HeaderView и Объект. Но он теряет фокус и регистрирует это предупреждение.

Используя

JOBSadapter.notifyDataSetChanged();

исправлена ​​проблема.

НО, если у Объекта внутри Адаптер, а Текстовый наблюдатель прикреплен к Объект внутри адаптера . Тогда вам может потребоваться немного больше работы.

Попробуйте удалить прослушиватель и присоединить его снова после выполнения любой работы, которую вы можете выполнять.

Object.removeTextChangedListener();

или

Object.addTextChangedListener(null);

Ответ 6

Помимо ответа antoniom, убедитесь, что любые дальнейшие действия, которые необходимо выполнить, действительно выполняются после скрытия клавиатуры, поэтому, если вы скрыли клавиатуру, подобную приведенной ниже:

public void hideKeyboard() {
InputMethodManager inputMethodManager =(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);
}

вам нужно выполнить последующие действия после скрытия клавиатуры, например:

getWindow().getDecorView().post(new Runnable() {            
        @Override
        public void run() {
            finish(); //Sample succeeding code
     }
});

Ответ 7

У меня была эта проблема, когда мне пришлось модифицировать или получать текст из EditText, и это было сфокусировано.

Итак, прежде чем модифицировать или получить от него, я закрыл клавиатуру и исправил ее.

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);

Возможно, ваша проблема другая.

Ответ 8

Я решил проблему с вводом типа ввода в xml следующим образом: андроид: inputType = "нет | текст | textCapWords | textUri"

до этого был android: inputType = "text" Это решило мою проблему.