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

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

getExtractedText on inactive InputConnection

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



답변

비슷한 문제가 발생했습니다. 내 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());
}


답변

최신 정보:

내가 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();

    // ... 
}

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


답변

도움말 문서에서

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

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

또한 추가 독서 쇼

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

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

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

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

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

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


답변

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


답변

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

이은에 의해 발생 된 객체 에서 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);


답변

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


답변

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

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

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

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