Cyril Mottier has a great post on customizing the send/done/return key on the Android soft keyboard。在尝试代码时,我(以及评论中的其他几个)注意到在XML中设置带有新ID的imeActionId(例如@ + id / ...)会向OnEditorActionListener返回0,当键被命中时用户,而不是唯一ID。但是,如果在ids.xml中设置ID并将imeActionId设置为该值(例如w / @id / ...),则会导致布局膨胀错误。
我能成功将imeActionId设置为唯一ID的唯一方法是在Java中以编程方式设置它。那么XML属性imeActionId的正确用法是什么?
以下是我所有代码的要点:https://gist.github.com/gsysko/d46adbe27d409bde0299
感谢您考虑这个问题。
答案 0 :(得分:29)
原因是imeActionId
在这种情况下有点用词不当。 imeActionId
的Javadoc说:
为输入法连接到文本视图时使用的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>
并像
一样使用它android:imeActionId="@integer/customImeActionId"
在您的代码中,您可以检索它
int imeActionId = getResources().getInteger(R.integer.customImeActionId);
编辑:好的,这引起了我的兴趣,因此在Android源代码中进一步查看,TextView解析了如下属性:
mEditor.mInputContentType.imeActionId = a.getInt(attr, mEditor.mInputContentType.imeActionId);
它将使用mEditor.mInputContentType.imeActionId
作为默认值 - 在这种情况下为0 - 如果它无法找到attr
的int值,这就解释了为什么它返回0您使用新创建的ID。我还没有发现通货膨胀错误的原因。