为什么使用预定义的ID资源设置imeActionId会产生错误?

gsy*_*sko 16 android android-softkeyboard

Cyril Mottier在Android软键盘上自定义了发送/完成/返回键.在尝试代码时,我(以及评论中的其他几个)注意到在XML中设置带有新ID的imeActionId(例如@ + id/...)会向OnEditorActionListener返回0,当键被命中时用户,而不是唯一ID.但是,如果在ids.xml中设置ID并将imeActionId设置为该值(例如w/@id/...),则会导致布局膨胀错误.

我能成功将imeActionId设置为唯一ID的唯一方法是以Java编程方式设置它.那么XML属性imeActionId的正确用法是什么?

这是我的所有代码的要点:https://gist.github.com/gsysko/d46adbe27d409bde0299

谢谢你考虑这个问题.

tre*_*r-e 29

原因是imeActionId在这种情况下,这是一个轻微的误称.Javadoc imeActionId说:

为输入方法连接到文本视图时使用的EditorInfo.actionId提供值.

它正在寻找你分配一个值.资源ID用于标识应用中的资源,但没有保证值.在某些情况下,您可以根据资源ID进行比较,例如View.getId(),但将资源ID与使用的常量值混合起来并不好EditorInfo.Android可能会试图通过抛出您所看到的异常来解析XML文件时阻止您执行此操作,但如果您以编程方式设置它,则在运行时可以执行的检查不多.

相反,您可以在资源中定义一个整数值,如下所示:

<!--res/values/integers.xml-->
<resources>
<item type="integer" name="customImeActionId" format="integer">100</item>
</resources>
Run Code Online (Sandbox Code Playgroud)

并使用它

android:imeActionId="@integer/customImeActionId"
Run Code Online (Sandbox Code Playgroud)

在您的代码中,您可以检索它

int imeActionId = getResources().getInteger(R.integer.customImeActionId);
Run Code Online (Sandbox Code Playgroud)

编辑:好的,这引起了我的兴趣,因此在Android源代码中进一步查看,TextView解析了以下属性:

mEditor.mInputContentType.imeActionId = a.getInt(attr, mEditor.mInputContentType.imeActionId);
Run Code Online (Sandbox Code Playgroud)

它将mEditor.mInputContentType.imeActionId用作默认值 - 在这种情况下为0 - 如果找不到int值attr,则说明如果使用新创建的ID,它返回0的原因.我没有找到通胀错误的原因.

  • 谢谢。您使用 Integer 资源的解决方案当然有效。令我感到困惑的是,Cyril 在对原始帖子的评论中特别提到他没有使用 Integer 资源。我很好奇他是如何让它与 ID 一起工作的? (3认同)