Cyril Mottier has a great post on customizing the send/done/return key on the Android soft keyboard .在尝试代码时,我(和评论中的其他几个人)注意到在 XML 中使用新 ID(例如 @+id/...)设置 imeActionId 会在键被击中时返回 0 给 OnEditorActionListener用户,而不是唯一 ID。但是,如果您在 ids.xml 中设置 ID 并将 imeActionId 设置为该 ID(例如 w/@id/...),则会导致布局膨胀错误。
我可以成功地将 imeActionId 设置为唯一 ID 的唯一方法是在 Java 中以编程方式设置它。那么XML属性imeActionId的正确用法是什么?
这是我所有代码的要点:https://gist.github.com/gsysko/d46adbe27d409bde0299
感谢您考虑这个问题。
最佳答案
原因是 imeActionId
在这种情况下有点用词不当。 imeActionId
的 Javadoc 说:
Supply a value for EditorInfo.actionId used when an input method is connected to the text view.
它正在寻找您分配一个值。资源 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);
如果找不到 attr
的 int 值,它将使用 mEditor.mInputContentType.imeActionId
作为默认值——在本例中为 0 ,这解释了为什么如果您使用新创建的 ID,它会返回 0。我还没有找到通货膨胀错误的原因。
关于android - 为什么使用预定义的 ID 资源设置 imeActionId 会产生错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23713604/