추출하다Android에서 비활성 InputConnection 경고 텍스트
로그캣에 다음과 같은 경고가 표시됩니다.
getExtractedText on inactive InputConnection
그 이유를 알 수가 없어요.제발 도와주세요.
저도 비슷한 문제에 부딪혔어요.내 로그캣:
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가 지워집니다.버튼을 빠르게 누르면 비활성 Input Connection 엔트리가 많이 스트리밍됩니다.
예:
editText.setText(null);
위의 로그캣의 마지막 행은 무슨 일이 일어나고 있는지 잘 보여줍니다.Input Connection에는 텍스트 클리어 요구가 쇄도하고 있습니다.지우기 전에 텍스트 길이를 확인하기 위해 코드를 수정했습니다.
if (editText.length() > 0) {
editText.setText(null);
}
이를 통해 버튼을 빠르게 눌러도 IInput Connection Wrapper 경고 스트림이 발생하지 않는다는 점에서 문제를 완화할 수 있습니다.그러나 앱이 충분한 부하를 받고 있을 때 사용자가 빠르게 무언가를 타이핑하거나 버튼을 누를 때 문제가 발생하기 쉽습니다.
다행히 텍스트를 클리어할 수 있는 다른 방법을 찾았습니다.Editable.clear() 입니다.이 경우 경고 메시지가 전혀 표시되지 않습니다.
if (editText.length() > 0) {
editText.getText().clear();
}
텍스트(autotext, autocap, multitap, undo)뿐만 아니라 모든 입력 상태를 지우려면 TextKeyListener.clear(편집 가능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의 솔루션에 따라 작동합니다.그러나 텍스트를 리셋하는 것은 문제가 있어서 입력 접속 경고를 받게 됩니다.
의 ★★★★★★★★★★★★★★★★★★★.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를 선택합니다.가 단지 '부르다'라고 부르는 것 수 것을 는 잘 모르겠습니다.getText.clear()
위에 (그 위에)setText(...)
inputConnection 고connectconnectconnect connectconnectconnectconnectconnect 생connectconnect ) 。
「」, 「」입니다.afterTextChanged(Editable s)
이치노
@Override
public void afterTextChanged(Editable s) {
if (isResettingKeyboard)
return;
resetKeyboardString();
// ...
}
지금까지 경고 없이 작동했습니다.
을 사용하다 때 되었습니다.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();
}
도움말 문서에서
http://developer.android.com/reference/android/view/inputmethod/InputConnection.html
InputConnection 인터페이스는 InputMethod에서 입력을 수신하는 응용 프로그램으로 돌아가는 통신 채널입니다.커서 주위의 텍스트 읽기, 텍스트 상자에 텍스트 커밋, 응용프로그램에 원시 키 이벤트 전송 등의 작업을 수행하는 데 사용됩니다.
또한, 더 자세히 읽어보면
get Extracted Text():이 메서드는 입력 연결이 비활성화되거나(프로세스 크래시 등), 클라이언트가 텍스트로 응답하는 데 시간이 너무 오래 걸리는 경우(복귀하는 데 몇 초가 소요됨)에 실패할 수 있습니다.어느 경우든 null이 반환됩니다.
또한 이러한 텍스트에 대한 변경 및 경고 변경도 모니터링하는 것으로 보입니다.
이 문제를 조사하려면 listViews 또는 lists를 중심으로 데이터베이스 쿼리를 조사해야 합니다.
뷰가 없는 경우(예를 들어 백그라운드에서 랜덤하게 발생하는 경우) UI 요소의 문제가 아니므로 텍스트 필드 등은 무시하십시오.커서에 정보를 저장하거나 커서를 요청하는 백그라운드 서비스일 수 있습니다.
또, 당신의 앱에서 문제가 발생합니까?아니면 최근에 설치한 다른 사람일 수도 있습니다.완전한 logCat 트레이스를 나열합니다.누군가가 문제를 인식할 수 있습니다.
만약 당신이 이것과 관련하여 특정한 무언가를 쓰지 않았다면 누군가 로그 메시지를 삭제하거나 당신이 사용하고 있는 라이브러리의 메시지를 삭제했을 것이라고 추측할 수 있습니다.
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
}
});
이 문제를 스스로 해결했으니까 당신도 같은 문제를 가지고 있을 거예요.
이 문제는 목록 어댑터의 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);
문자 감시기가 작동하니 문제없어요.
하지만 처음 빌드한 후에 어댑터를 다시 조립한 적이 있다면요.
JobsAdapter = new IN_JOBS_ADAPTER(CONTEXT, DIFFERENT_ITEMS_FOR_ADAPTER);
ListView.setAdapter(JOBSadapter);
그 HeaderView도 재구축됩니다.
이 경고는 객체가 제거되고 텍스트 워처가 여전히 객체를 감시하도록 설정되어 있기 때문에 표시됩니다.
List Adapter와 Object는 교체되었고, Text Watcher는 그 일이 일어났을 때 외면하고 있었던 것 같습니다.
따라서 경고가 울리고 텍스트워처는 기적적으로 HeaderView와 오브젝트를 검출합니다.하지만 초점을 잃고 경고를 기록합니다.
사용.
JOBSadapter.notifyDataSetChanged();
문제를 해결했습니다.
그러나 어댑터 내부에 개체가 있고 텍스트 워처가 어댑터 내부의 개체에 연결되어 있는 경우.그럼 일을 좀 더 해야겠네요.
Listener를 제거한 후 작업을 수행한 후 다시 연결하십시오.
Object.removeTextChangedListener();
또는
Object.addTextChangedListener(null);
...어떻게 빌드에서 컨트롤러를 초기화할 수 있었는지 모르겠지만, 이미 초기화를 완료했습니다.
`Widget build(BuildContext context) {
final _formKey = GlobalKey<FormState>();
final prodName = TextEditingController();
final prodDesc = TextEditingController();
final prodPrice = TextEditingController();
...`
대신해서
`final _formKey = GlobalKey<FormState>();
final prodName = TextEditingController();
final prodDesc = TextEditingController();
final prodPrice = TextEditingController();
...
Widget build(BuildContext context) {`
물론 컨트롤러와 GlobalKey를 제 폼에 맞게 배치한 후에는 (예상대로) 모두 사라졌습니다.
EditText에서 텍스트를 수정하거나 받아야 할 때 포커스가 잡혔을 때 이런 문제가 있었습니다.
그래서 수정하거나 사용하기 전에 키보드를 닫고 고칩니다.
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
아마, 너의 문제는 다를거야.
xml에 다음과 같은 입력 유형을 삽입하는 문제를 해결했습니다: Android:inputType="none|text|textCapWords|textUri"
이전 버전에서는 Android:inputType="text"로 문제가 해결되었습니다.
비활성 InputConnection에서의 Logcat 오류: getTextBeforeCursor
솔루션:입력 키보드를 숨기고 응용 프로그램을 실행합니다.
EditText를 지우기 전에 소프트웨어 키보드를 숨깁니다. 경고가 표시되지 않습니다.
또, 디바이스 고유의 것 같습니다.Nexus 4(Android 7.1)에서만 볼 수 있습니다.에뮬레이터(8.0, 7.1) 또는 Nexus 5에서는 경고가 발생하지 않습니다.
이 문제는 의 가시성 설정에 의해 발생하였습니다.EditText
로.GONE
그 후 즉시 로 설정합니다.VISIBLE
사용자가 문자를 입력할 때마다, 텍스트가 변경될 때마다 입력에 대한 유효성 검사를 실행 중이었고 경우에 따라 보기를 숨길 필요가 있었습니다.
은 UI 상태 업데이트 또는 Layout의 을 "" "Layout" "GONE"으로하지 않도록 입니다.EditText
을 잃을 수
동일한 문제를 해결하고 상태 비저장 위젯을 상태 비저장 위젯으로 변환하여 해결할 수 있습니다.
그것은 정말 간단한 수정이 있다.Textformfield를 사용할 때마다 autofocus==true를 입력하십시오.날 위해 일했다!
언급URL : https://stackoverflow.com/questions/8122625/getextractedtext-on-inactive-inputconnection-warning-on-android
'IT' 카테고리의 다른 글
json_encode()를 사용하여 PHP 어레이에서 JSON 어레이로. (0) | 2022.10.30 |
---|---|
JSONObject와 JSONArray의 차이점 (0) | 2022.10.30 |
MySql.Data.MySql Client 。MySqlException: "호스트 로컬 호스트가 SSL 연결을 지원하지 않습니다." (0) | 2022.10.30 |
개체가 배열인지 확인하려면 어떻게 해야 합니까? (0) | 2022.10.30 |
PhpMyAdmin: "요청 처리 중 오류 발생:" (오류 없음) (0) | 2022.10.30 |