强制从 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.animator
和0x7f02
,等等).
总之,所有这一切的结果是每个生成的R.id
值都是负数。
我建议只使用 old-school static final
常量。如果出于某种原因,您通过将这些整数作为资源系统的一部分而获得价值,您可以使用整数资源:
<integer name="permission_request">100</integer>
但这意味着您需要一个 Context
实例,以便您可以调用 context.getResources().getInteger(R.integer.permission_request)
,我认为这很麻烦。
最近我养成了在 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.animator
和0x7f02
,等等).
总之,所有这一切的结果是每个生成的R.id
值都是负数。
我建议只使用 old-school static final
常量。如果出于某种原因,您通过将这些整数作为资源系统的一部分而获得价值,您可以使用整数资源:
<integer name="permission_request">100</integer>
但这意味着您需要一个 Context
实例,以便您可以调用 context.getResources().getInteger(R.integer.permission_request)
,我认为这很麻烦。