强制从 ids.xml 生成正整数

Forcing a positive integer to be generated from ids.xml

最近我养成了在 res/values/ids.xml 中为请求 ID 创建常量的习惯,以减少混乱并确保每个请求都真正独一无二。例如,我可以将自定义 ID 指定为 the request code for a PendingIntent。但是,我刚刚发现在处理权限请求时我不能采用这种方法。

假设我有这个 ids.xml 文件:

<resources>
    <item name="permission_request" type="id" />
</resources>

当我使用这个生成的 ID 作为我的许可请求的一部分时:

ActivityCompat.requestPermissions(this,
            new String[] { Manifest.permission.ACCESS_NETWORK_STATE },
            R.id.permission_request);

我收到一条错误消息,在 requestCode 字段下划线:

Value must be ≥ 0 (was -1100091)

我可以通过将 ID 包装在 Math.abs() 调用中来解决这个问题,但这似乎有点老套。如果我尝试使用 switch 语句检查 onRequestPermissionsResult() 中的 requestCode,这也会失败,因为 Math.abs(R.id.permission_request) 不是常量值。

那么有没有办法确保 ids.xml 中的值总是 returns 大于 0 的值,或者我应该坚持老式的方法并使用 private static final int 自己定义的权限请求?

EDIT 我现在意识到 ACCESS_NETWORK_STATE 是一个正常级别的权限,我不需要向用户询问。但是,主要问题仍然存在。

我没有文档来支持这一点,但我的理解是每个 aapt-generated 资源 ID(不仅仅是 R.id,而是任何 R 内部 class ) 以 0x7f 开头。接下来的两位代表subclass(R.anim是第一个生成的,所以它的常量以0x7f01开头,接着是R.animator0x7f02,等等).

总之,所有这一切的结果是每个生成的R.id值都是负数。

我建议只使用 old-school static final 常量。如果出于某种原因,您通过将这些整数作为资源系统的一部分而获得价值,您可以使用整数资源:

<integer name="permission_request">100</integer>

但这意味着您需要一个 Context 实例,以便您可以调用 context.getResources().getInteger(R.integer.permission_request),我认为这很麻烦。