get Word At Cursor from InputConnection - Android android.view.inputmethod

Android examples for android.view.inputmethod:InputConnection

Description

get Word At Cursor from InputConnection

Demo Code

/*/*from   w  w w  .j  a v a 2  s  .  c  o m*/
 * Copyright (C) 2009 Google Inc.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
import android.text.TextUtils;
import android.view.inputmethod.ExtractedText;
import android.view.inputmethod.ExtractedTextRequest;
import android.view.inputmethod.InputConnection;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.regex.Pattern;

public class Main{
    /**
     * @param connection connection to the current text field.
     * @param sep characters which may separate words
     * @param range the range object to store the result into
     * @return the word that surrounds the cursor, including up to one trailing
     *   separator. For example, if the field contains "he|llo world", where |
     *   represents the cursor, then "hello " will be returned.
     */
    public static String getWordAtCursor(InputConnection connection,
            String separators, Range range) {
        Range r = getWordRangeAtCursor(connection, separators, range);
        return (r == null) ? null : r.word;
    }
    private static Range getWordRangeAtCursor(InputConnection connection,
            String sep, Range range) {
        if (connection == null || sep == null) {
            return null;
        }
        CharSequence before = connection.getTextBeforeCursor(1000, 0);
        CharSequence after = connection.getTextAfterCursor(1000, 0);
        if (before == null || after == null) {
            return null;
        }

        // Find first word separator before the cursor
        int start = before.length();
        while (start > 0 && !isWhitespace(before.charAt(start - 1), sep))
            start--;

        // Find last word separator after the cursor
        int end = -1;
        while (++end < after.length()
                && !isWhitespace(after.charAt(end), sep))
            ;

        int cursor = getCursorPosition(connection);
        if (start >= 0 && cursor + end <= after.length() + before.length()) {
            String word = before.toString().substring(start,
                    before.length())
                    + after.toString().substring(0, end);

            Range returnRange = range != null ? range : new Range();
            returnRange.charsBefore = before.length() - start;
            returnRange.charsAfter = end;
            returnRange.word = word;
            return returnRange;
        }

        return null;
    }
    private static boolean isWhitespace(int code, String whitespace) {
        return whitespace.contains(String.valueOf((char) code));
    }
    private static int getCursorPosition(InputConnection connection) {
        ExtractedText extracted = connection.getExtractedText(
                new ExtractedTextRequest(), 0);
        if (extracted == null) {
            return -1;
        }
        return extracted.startOffset + extracted.selectionStart;
    }
}

Related Tutorials