안드로이드 오류 관련 질문드립니다.

조회수 1343회
protected void performFiltering(final CharSequence text, final int keyCode) { 

 String filterText = " ";

 super.performFiltering(filterText, keyCode); // <- 에러가 나는 부분

}
public int findTokenStart(CharSequence text, int cursor) {
        int i = cursor;

    Log.e("index : " + i, "text : " + text.charAt(i - 1)); // 에러 잡기위한 Log

        while (i > 0 && text.charAt(i - 1) != ' ') { // <- 에러가 나는 부분
            i--;
        }
        while (i < cursor && text.charAt(i) == ' ') {
            i++;
        }
        return i;
    }

우선 오픈소스 가져와서 해석하면서 사용중인 코드들 입니다.

전체적인 프로그램 동작에 대해 설명드리면 autoCompleteTextview라고 단어를 배열이나 db에 넣어놓고

사용자가 앱에서 단어를 입력하려하면 자동으로 매칭해서 연관있는 단어를 자동완성 리스트로 쭉 뽑아내주는 기능을 합니다.

(ex. '안' 이나 '안녕' 까지만 치면 '안' 이나 '안녕'으로 시작하는, 안철수, 안녕하세요.. 등등이 리스트로 나올 수 있습니다.. 이건 제가 넣어놓는 자동완성 단어 데이터들이구요.)

발생하는 오류는 java.lang.StringIndexOutOfBoundsException 요놈이고 제가 위 코드 주석처리 해놓은부분에서 오류가 발생한다고 나옵니다.

제가볼때는 위 함수에서 filterText 요놈이 문제를 일으키는 것 같은데 대체 이놈의 역할이 뭔지를 도통 모르겠습니다.

밑에 함수가 하는 일은 공백을 탐색하는 일을 하는 Tokenizer 함수의 일부분인데

공백을 왜 탐색하느냐면 자동완성을 한번 하고 끝낼게 아니라 계속 사용해야 하는데

단어가 언제 완성돼서 다시 자동완성 기능을 사용해야 하는지.

이걸 공백으로 구분하기 때문에 탐색해주는 것이에요..

단어가 완성됐음을 공백을 통해서 파악했으면 다시 특정 단어를 입력하려하면 다시 자동완성 리스트가 펼쳐집니다. 요 클래스가 없으면 딱 한번 기능을 사용하고 앱을 다시 켤 때 까지는 기능을 사용할 수 없습니다. 그래서 자동완성 리스트에서 완성시킬 단어를 하나 선택해서 자동완성 시키면, 자동적으로 완성된 단어 뒤에 공백이 하나 붙어요. '안'만 친 상태에서 '안녕하세요' 를 리스트에서 선택해서 완성시켰으면 '안녕하세요 ' 이렇게 뒤에 공백이 자동적으로 생깁니다.

(비슷하게 콤마(,)로 구분해주는 Tokenizer도 기본 라이브러리 메소드로 제공해줍니다.)

우선 filterText 요놈이 " " 라는 공백값이 삽입돼있는데 공백의 개수를 판별해드리기 위해 \n 로 공백표시를 할게요.

"" 로 바꿔주면 앱 실행 후 단어입력 시도하려하면 바로 앱 중지,

"\n" 상태라면 한글자 치고 이어서 뭔가를 치려하거나, 한글자만 치고 그 한글자를 다시 지우려고 하면 마지막 초성을 남겨두고 앱 중지, 공백을 한칸 더 넣어줘서 "\n\n" 상태라면 두글자 치고 이어서 뭔가를 치려하면 앱 중지. 얘도 마찬가지로 그 글자를 다시 지우려고 하면 마지막 초성을 남겨두고 앱 중지

-> 여기서 '마지막 초성을 남겨두고'라는건, '안' 이라는 글자를 치고 키보드 백스페이스로 지우려면 안->아->ㅇ-> 순으로 지워지는데요.
근데 여기서 ㅇ만 남긴 상태에서 ㅇ 요놈을 지우려고 하면 앱이 중지된다는 얘기 입니다.

설명하기 굉장히 어렵고 난해하긴 한데, 도움의 손길이 너무나도 간절합니다. 고견을 기다립니다 ㅠ.ㅠ

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)