Android의 비활성 InputConnection 경고에 대한 getExtractedText


129

내 logcat에 다음 경고가 표시됩니다.

getExtractedText on inactive InputConnection

나는 그 이유를 찾을 수 없습니다. 도와주세요


4
이 질문에서 모호 / 모호 / 불완전한 것이 무엇인지 이해하지 못합니까? 내 앱을 실행하는 동안 내 logcat에이 경고가 표시됩니다.이 경고의 이유를 알고 싶습니다.
pankajagarwal

2
나는 또한 내가 개발중인 응용 프로그램에서 이것을 발견하고 있으며 그것이 어디에서 왔는지, 왜 그런지 전혀 모릅니다. 누군가가 발견하면 의견을 게시하십시오. 실제로 "getExtractedText"이외의 다양한 경고를 표시합니다. 또한 "beginBatchEdit", "endBatchEdit", "getTextBeforeCursor"등이 있습니다.
스팬

1
이 질문을보고있는 중재자입니다. 그들은 여전히 모호하고 amibiguous 후에도 14 upvotes으로이 질문을 믿는다면 그들은 그때 무슨 말을 해야할지 모르겠어요해야하기 때문에하지 다음 경우
pankajagarwal

동의합니다.이 문제도 해결해야합니다. 나는 원인을 모른다.
JonWillis

3
이 오류를 일으키는 코드는 무엇입니까?
Bill the Lizard

답변:


44

비슷한 문제가 발생했습니다. 내 logcat :

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 (Editable e)를 사용할 수 있습니다 .

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

1
나는 또한 IInputConnectionWrapper 경고를 받고 있었고 내 앱은 거의 ANR을 얻었고, clear () 메소드는 나를 위해 일했습니다. setText ( "");
상자

17

최신 정보:

내가 InputConnection 경고를받는 이유는 내가 텍스트를 설정 한 곳 (즉, onTextChanged콜백 또는 afterTextChanged) 때문이 아니라 setText.

다음 전화로 문제를 해결했습니다.

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

참고 : afterTextChanged경고없이 작동하지만 여전히 콜백 에서 전화를 겁니다 ontextChanged.

이전 답변 :

시나리오는 약간 다르지만 logcat에서도 동일한 메시지를 받았습니다. EditText (또는 작성된 문자 / 붙여 넣기 텍스트)에 들어온 모든 문자를 읽은 다음 문제의 EditText를 기본 초기화 문자열로 재설정하고 싶었습니다.

일반 텍스트 부분은 위의 Johnson의 솔루션에 따라 작동합니다. 그러나 텍스트를 재설정하는 것이 문제가되어 inputconnection 경고가 표시됩니다.

처음에 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(...)호출되면 글고 치기는 읽기 전용 모드에 있습니다. 이것이 우리가 getText.clear()그것을 호출 하는 것 이상을 할 수 없다는 것을 의미하는지 확실하지 않습니다 ( setText(...)호출은 inputConnection 경고도 생성합니다).

그러나 콜백 afterTextChanged(Editable s)은 텍스트를 설정하는 올바른 위치입니다.

@Override
public void afterTextChanged(Editable s) {

    if (isResettingKeyboard)
        return;

    resetKeyboardString();

    // ... 
}

이것은 지금까지 경고없이 작동합니다.


나도 같은 문제가 있었다. 내가 깨달은 것은 귀하의 솔루션이 InputConnection 경고를 사라지게하더라도 afterTextChanged메서드가 on hiddenKeyboardText.getText().clear();뿐만 아니라 on에서도 호출 된다는 것을 알았으며이 hiddenKeyboardText.append("some string");사실도 고려해야한다는 것입니다. 나에게서 +1!
Nick

@Nick 사실 - 중요한 보장하기 if (isResettingKeyboard) return;... 상단에
ahash

7

도움말 문서에서

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

InputConnection 인터페이스는 InputMethod에서 입력을 수신하는 애플리케이션으로의 통신 채널입니다. 커서 주변의 텍스트 읽기, 텍스트 상자에 텍스트 커밋, 원시 키 이벤트를 애플리케이션에 보내는 등의 작업을 수행하는 데 사용됩니다.

또한 추가 독서 쇼

getExtractedText () : 입력 연결이 유효하지 않거나 (예 : 프로세스 충돌) 클라이언트가 텍스트로 응답하는 데 너무 오래 걸리는 경우 (반환하는 데 몇 초가 소요됨)이 메서드는 실패 할 수 있습니다 . 두 경우 모두 널이 리턴됩니다.

또한 이러한 텍스트의 변경 사항과 경고 변경 사항을 모니터링하는 것으로 보입니다.

문제를 해결하려면 listViews 또는 레이아웃의 목록을 중심으로 작성중인 데이터베이스 쿼리를 탐색해야합니다.

예를 들어 백그라운드에서 무작위로 발생하는 뷰가 없으면 UI 요소 문제가 아니라고 제안하므로 텍스트 필드 등을 무시하십시오. 커서에 정보를 저장하거나 커서를 요청하는 백그라운드 서비스 일 수 있습니다.

또한 앱에서 문제가 발생합니까? 또는 최근에 설치 한 다른 사람 일 수도 있습니다. 전체 logCat 추적을 나열하십시오. 누군가가 문제를 인식 할 수 있습니다.

나는 당신이 이것에 대해 다른 누군가의 로그 메시지 또는 아마도 당신이 사용하는 라이브러리의 메시지를 구체적으로 작성하지 않았다면 추측 할 수 있습니다.


1
감사합니다. DB 쿼리를 작성하지만 이상하게도 에뮬레이터에서 앱을 실행할 때이 경고가 표시되지 않으므로 실제로 내 기기에 설치된 다른 앱 때문일 수 있습니다. 이 방향으로 볼 것입니다
pankajagarwal 2012-08-23

최신 logCat은 필터링 된 다른 앱과 구별되는 메시지를 보여줍니다. 그래도 확인하기에 충분히 사용하지 않았습니다. 비어있는 새 앱을 만들고 로그 고양이를보고 오류가 발생하는지 확인하면 앱이 제거됩니다. 문제에서.
Emile

@frieza는 반드시 다른 앱은 아닙니다. sqlite와 함께 ArrayAdapter를 추가했으며 이제 전화 에서도이 경고를 받고 있습니다. 에뮬레이터에서 오류가 발생하지 않는 이유는 속도가 느려지고 그 결과 성능 임계 값이 비활성화되기 때문입니다.
alandarev 2014 년

7

나는 같은 문제를 겪고 있었다. 내 중 하나에서 소프트 키보드가 활성화되고 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();
}

2
이것은 괜찮은 대답입니다. 현재 화면에있는 활동에서 벗어나기 전에 키보드를 숨겼는지 확인하십시오.
Gábor

1

이 문제를 직접 해결했을 수도 있습니다.

이은에 의해 발생 된 객체 에서 HeaderView목록 어댑터 .

나는 팽창 보기 및 선언 된 개체 와 넣어 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 도 다시 작성됩니다.

이 경고는 Object 가 제거되고 Text Watcher가 여전히이를 감시하도록 설정 되었기 때문에 표시 됩니다.

목록 어댑터개체 대체되었고, 나는 추측하고있어 감시자가 텍스트 가 일어 났을 때 다른 방법을 찾고 있었다.

따라서 경고가 발생하고 기적적으로 Text WatcherHeaderViewObject를 찾습니다 . 그러나 초점을 잃고 경고를 기록합니다.

사용

JOBSadapter.notifyDataSetChanged();

문제를 해결했습니다.

하지만 당신이있는 경우에 객체 내부 어댑터텍스트 감시자가 받는 부착 된 객체 내부 어댑터 . 그런 다음 조금 더 많은 작업이 필요할 수 있습니다.

리스너를 제거하고 수행중인 작업을 수행 한 후 다시 연결하십시오.

Object.removeTextChangedListener();

또는

Object.addTextChangedListener(null);

1

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
     }
});

0

EditText에서 텍스트를 수정하거나 가져와야 할 때이 문제가 발생했으며 초점이 맞았습니다.

따라서 수정하거나 가져 오기 전에 키보드를 닫고 수정했습니다.

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

아마도 당신의 문제는 다를 것입니다.


0

다음과 같이 xml에 입력 유형을 삽입하는 문제를 해결했습니다. android : inputType = "none | text | textCapWords | textUri"

그 전에 android : inputType = "text"이것은 내 문제를 해결했습니다.


3
나를 위해 아무것도하지 않았습니다.
DSlomer64

0

Logcat 오류 : 비활성 InputConnection의 getTextBeforeCursor

해결 방법 : 입력 키보드를 숨기고 응용 프로그램을 실행하십시오.


0

EditText를 지우기 전에 소프트웨어 키보드 숨기기 -경고가 표시되지 않습니다.

또한 기기에 따라 다릅니다 . Nexus 4 (Android 7.1)에서만 본 적이 있습니다. 에뮬레이터 (8.0, 7.1) 또는 Nexus 5에 대한 경고가 없습니다.


0

내 문제는 EditTextto 의 가시성을 GONE설정 한 다음 VISIBLE사용자가 문자를 입력 할 때마다 즉시 설정했기 때문에 발생했습니다 . 텍스트가 변경 될 때마다 입력에 대한 유효성 검사를 실행하고 경우에 따라 뷰를 숨겨야했기 때문입니다.

따라서 해결책은 UI 또는 상태 업데이트 사이에 뷰 또는 레이아웃의 가시성을 GONE으로 설정하지 않는 EditText것입니다.


0

동일한 문제를 해결하고 내 상태 비 저장 위젯을 statefull 위젯으로 변환하여 수정 해보세요.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.