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

Cyril Mottier在Android软键盘上定制了发送/完成/返回键有一个很好的post 。 当试用代码时,我(和其他几个注释)注意到,用XML中的新ID(例如@ + id / …)设置imeActionId将返回0给OnEditorActionListener,当键被用户,而不是唯一的ID。 但是,如果您在ids.xml中设置了一个ID并将imeActionId设置为(例如w / @id / …),则会导致布局膨胀错误。

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

这是一个Gist与我所有的代码: https : //gist.github.com/gsysko/d46adbe27d409bde0299

感谢您考虑这个问题。

Solutions Collecting From Web of "为什么使用预定义的ID资源设置imeActionId会产生错误?"

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

为input法连接到文本视图时使用的EditorInfo.actionId提供一个值。

它正在寻找你分配一个值。 资源ID用于识别应用程序中的资源,并且没有保证值。 在某些情况下,您可以根据资源ID(如View.getId()进行比较,但将资源ID与EditorInfo使用的常量值混合并不好。 Android可能会试图通过抛出你所看到的exception来parsing你的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源代码,TextViewparsing的属性,如:

 mEditor.mInputContentType.imeActionId = a.getInt(attr, mEditor.mInputContentType.imeActionId); 

它将使用mEditor.mInputContentType.imeActionId作为默认值 – 在这种情况下为0 – 如果找不到attr的int值,这就解释了为什么在使用新创build的ID时返回0。 我没有find通货膨胀错误的原因。