在处理另一个项目时,我注意到我之前制作的测试键盘在 logcat 中弹出了一个异常(基于这个答案的“继续”部分)。它安装在我的手机上,但它不是我当前正在运行的项目。
XmlPullParserException:元数据不以输入法标记开头
我重新测试了键盘,它仍然可以工作,所以这似乎不是一个大问题。不过,如果可以的话,我不喜欢留下错误。
我找不到与此相关的任何其他问题,但我确实找到了在InputMethodInfo
的源代码中调用它的位置:
String nodeName = parser.getName();
if (!"input-method".equals(nodeName)) {
throw new XmlPullParserException(
"Meta-data does not start with input-method tag");
}
什么会导致此错误发生?
输入法服务
public class WodeInputMethodService extends InputMethodService implements ImeContainer.OnSystemImeListener {
@Override
public View onCreateInputView() {
LayoutInflater inflater = getLayoutInflater();
ImeContainer jianpan = (ImeContainer) inflater.inflate(R.layout.jianpan_yangshi,
null, false);
jianpan.showSystemKeyboardsOption("ᠰᠢᠰᠲ᠋ᠧᠮ");
jianpan.setOnSystemImeListener(this);
return jianpan;
}
@Override
public InputConnection getInputConnection() {
return getCurrentInputConnection();
}
@Override
public void onChooseNewSystemKeyboard() {
InputMethodManager im = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
if (im == null) return;
im.showInputMethodPicker();
}
}
该错误可能隐藏得比这更深(例如在自定义键盘视图或它继承的库键盘中),但由于涉及的代码量,我首先问一个基本问题。如果我找到答案或更相关的代码,我将发布更新。
04-26 10:30:13.466 855-880/? A/InputMethodManagerService: Unable to load input method ComponentInfo{net.studymongolian.jianpan/net.studymongolian.jianpan.WodeInputMethodService}
org.xmlpull.v1.XmlPullParserException: Meta-data does not start with input-method tag
at android.view.inputmethod.InputMethodInfo.<init>(InputMethodInfo.java:162)
at com.android.server.InputMethodManagerService.buildInputMethodListLocked(InputMethodManagerService.java:2732)
at com.android.server.InputMethodManagerService$MyPackageMonitor.onSomePackagesChanged(InputMethodManagerService.java:554)
at com.android.internal.content.PackageMonitor.onReceive(PackageMonitor.java:402)
at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:863)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.os.HandlerThread.run(HandlerThread.java:61)
不幸的是,这不是 MCVE 问题,因为我无法重现该问题。我也不知道导致问题的代码的确切部分。不过,我仍在问这个问题,因为熟悉该错误的人可以描述导致该错误的具体情况。
我遇到了同样的问题,正确的方法是在 method.xml 中有一个“subtype”关键字,但它必须是 xml 中的第一个元素:在“subclass”或“settings”之前。
<input-method xmlns:android="http://schemas.android.com/apk/res/android">
<subtype android:label="French (FR)"
android:imeSubtypeLocale="fr_FR"
android:imeSubtypeMode="keyboard" />
<!-- Specify the class name of the custom keyboard -->
<subclass android:name=".MyKeyboard" />
<!-- Specify the settings activity (optional) -->
<settings android:activity="com.example.customkeyboard.KeyboardSettingsActivity" />
</input-method>