Как использовать атрибут «android: inputMethod»?

1

Мне нужно использовать пользовательский метод ввода для конкретного редактирования текстов внутри моего приложения.

Метод ввода успешно работает со всеми приложениями (когда я выбираю его из системного меню). Так что все в порядке с методом.

Но когда я пытаюсь явно использовать его:

<EditText
    android:id="@+id/edit"
    android:inputMethod="tx.android.softkeyboard.TXSoftKeyboard"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

это вызывает ClassNotFoundException

Caused by: java.lang.ClassNotFoundException: tx.android.softkeyboard.TXSoftKeyboard
        at java.lang.Class.classForName(Native Method)
        at java.lang.Class.forName(Class.java:400)
        at java.lang.Class.forName(Class.java:326)
        at android.widget.TextView.<init>(TextView.java:1233)
        at android.widget.EditText.<init>(EditText.java:64) 

Класс tx.android.softkeyboard.TXSoftKeyboard существует, конечно.

В другой теме пользователь m0skit0 сообщил о похожем поведении, но не нашел решения..

Теги:
android-layout
android-input-method

1 ответ

0
Лучший ответ

Я проверил в AOSP и в TextView вы можете ясно видеть, что значение атрибута не изменяется (это легко проследить, в строке 1034 атрибут извлекается, а затем используется в следующем фрагменте кода):

    if (inputMethod != null) {
        Class<?> c;
        try {
            c = Class.forName(inputMethod.toString());
        } catch (ClassNotFoundException ex) {
            throw new RuntimeException(ex);
        }
        try {
            createEditorIfNeeded();
            mEditor.mKeyListener = (KeyListener) c.newInstance();
        } catch (InstantiationException ex) {
            throw new RuntimeException(ex);
        } catch (IllegalAccessException ex) {
            throw new RuntimeException(ex);
        }
        try {
            mEditor.mInputType = inputType != EditorInfo.TYPE_NULL
                    ? inputType
                    : mEditor.mKeyListener.getInputType();
        } catch (IncompatibleClassChangeError e) {
            mEditor.mInputType = EditorInfo.TYPE_CLASS_TEXT;
        }
    }

Итак, самое близкое, что мы можем обойти, это вызвать TextView#setKeyListener() (это в основном то, что делает этот кусок кода, обратите внимание на приведение после создания экземпляра класса после его загрузки mEditor.mKeyListener = (KeyListener) c.newInstance();). При этом, KeyListener из моего ограниченного понимания этой темы, KeyListener - это не то, что вы ищете.

  • 1
    Конечно, я тоже смотрю на это и возобновляет подобное ..

Ещё вопросы

Сообщество Overcoder
Наверх
Меню