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

标签 android android-softkeyboard

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/

相关文章:

android - 将 surfaceView(带相机预览)移动到屏幕左侧

android - 如何使用 MPAndroidChart 在单个图形中绘制两条线?

java - 从反向地理编码地址中提取 'Locality' 详细信息。

android - 如何修复 Google Maps Android v2 上的语言环境问题?

java - 我是否必须覆盖 `onEditorAction` 或者 "action_done"是否具有默认行为?

android - 如何关闭Android软键盘

Android 使用键盘上的完成按钮单击按钮

android - 如何在 PopupWindow 上显示键盘?

java - 未定义类型 new View.OnClickListener(){}

android - 在选择 EditText 之前禁用 Android 中的软件键盘