Мне нужно использовать пользовательский метод ввода для конкретного редактирования текстов внутри моего приложения.
Метод ввода успешно работает со всеми приложениями (когда я выбираю его из системного меню). Так что все в порядке с методом.
Но когда я пытаюсь явно использовать его:
<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 сообщил о похожем поведении, но не нашел решения..
Я проверил в 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
- это не то, что вы ищете.