最近,我一直养成在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
字段:
值必须≥0(是-1100091)
我可以通过在Math.abs()
调用中包装ID来解决这个问题,但这看起来有点像hacky。如果我尝试使用requestCode
语句检查onRequestPermissionsResult()
中的switch
,Math.abs(R.id.permission_request)
ids.xml
不是常量值,也会失败。
那么有没有办法确保private static final int
中的值始终返回大于0的值,或者我应该坚持老式的方式并使用我自己定义的ACCESS_NETWORK_STATE
进行许可请求?
编辑我现在意识到published_posts
是一个普通级别的权限,我不需要询问用户。但是,主要问题仍然存在。
答案 0 :(得分:2)
我没有备份文档,但我的理解是,每个aapt生成的资源ID(不只是R.id
,而是R
内部类)都以0x7f
开头。接下来的两位数代表子类(R.anim
是第一个生成的子类,因此其常量以0x7f01
开头,后跟R.animator
0x7f02
等等。
无论如何,所有这一切的结果是每个生成的R.id
值都是负数。
我建议只使用老派的static final
常量。如果由于某种原因你从这些整数作为资源系统的一部分获得价值,你可以使用整数资源:
<integer name="permission_request">100</integer>
但这意味着你需要一个Context
个实例,以便你可以调用我认为非常繁琐的context.getResources().getInteger(R.integer.permission_request)
。