Cyril Mottier has a great post on customizing the send/done/return key on the Android soft keyboard。尝试代码时,我(和注释中的其他几个人)注意到,用XML设置新的ID(例如@ + id/...)时,将imeActionId设置为OnEditorActionListener时,会将0返回给OnEditorActionListener。用户,而不是唯一ID。但是,如果您在ids.xml中设置一个ID并将imeActionId设置为该ID(例如w/@id/...),则会导致布局膨胀错误。

我可以成功地将imeActionId设置为唯一ID的唯一方法是在Java中以编程方式对其进行设置。那么,XML属性imeActionId的正确用法是什么?

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

感谢您考虑这个问题。

最佳答案

原因是在这种情况下imeActionId略有误名。 imeActionId的Javadoc说:



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

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

<!--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的int值,它将使用attr作为默认值(在这种情况下为0),这说明了为什么使用新创建的ID时它会返回0。我还没有找到导致通货膨胀错误的原因。

关于android - 为什么用预定义的ID资源设置imeActionId会产生错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23713604/

10-10 07:11