如何使用 "android:inputMethod" 属性?

How to use "android:inputMethod" attribute?

我需要在我的应用程序中使用自定义输入法来编辑特定文本。

输入法适用于所有应用程序(当我从系统菜单中 select 它时)。这样方法就OK了。

但是当我试图明确强制使用它时:

<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) 

Class tx.android.softkeyboard.TXSoftKeyboard当然存在。

另一个 用户 m0skit0 报告了类似的行为但没有解决方案..

我已经在 AOSP 和 TextView you can clearly see that the value of the attribute is not modified (it's easy to follow, in line 1034 the attribute is fetched and later is used in the following piece of code 中检查过):

    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()(这基本上就是这段代码所做的,注意在创建 class 的实例后的转换它已加载 mEditor.mKeyListener = (KeyListener) c.newInstance();)。话虽这么说,根据我对这个主题的有限理解,KeyListener 不是你要找的。