【问题标题】:Why does setting imeActionId with a predefined ID resource create an error?为什么使用预定义的 ID 资源设置 imeActionId 会产生错误?
【发布时间】:2025-12-14 15:30:01
【问题描述】:

Cyril Mottier has a great post on customizing the send/done/return key on the Android soft keyboard。在尝试代码时,我(和 cmets 中的其他几个人)注意到在 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

感谢您考虑这个问题。

【问题讨论】:

    标签: android android-softkeyboard


    【解决方案1】:

    原因是 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值,这就解释了为什么如果你使用一个新创建的ID它返回0 .我还没有找到通货膨胀错误的原因。

    【讨论】:

    • 谢谢。您使用 Integer 资源的解决方案当然有效。令我感到困惑的是,Cyril 在原帖中特别提到他没有在他的 cmets 中使用整数资源。我很好奇他是如何让它与 ID 一起工作的?
    • 您也可以使用较短的变体&lt;integer name="customImeActionId"&gt;100&lt;/integer&gt; 代替&lt;item type="integer" name="customImeActionId" format="integer"&gt;100&lt;/item&gt;
    最近更新 更多