如何使用“ android:inputMethod”属性?

时间:2019-03-18 16:56:12

标签: android android-layout android-input-method

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

输入法可成功用于所有应用程序(当我从系统菜单中选择输入法时)。因此,使用该方法就可以了。

但是当我尝试强制其明确使用时:

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

在另一个topic用户中,m0skit0报告了类似的行为,但没有解决方案。

1 个答案:

答案 0 :(得分:0)

我已经在AOSP中进行了检查,并且在TextView中您可以清楚地看到该属性的值未修改(很容易理解,在line 1034中,该属性已获取,后来在以下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()(这基本上就是这段代码的作用,请在加载类实例后立即注意强制类型转换{{1 }})。话虽这么说,但根据我对该主题的有限了解,mEditor.mKeyListener = (KeyListener) c.newInstance();并不是您想要的。