强制从ids.xml生成正整数

时间:2018-02-16 22:20:53

标签: android android-permissions

最近,我一直养成在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()中的switchMath.abs(R.id.permission_request) ids.xml不是常量值,也会失败。

那么有没有办法确保private static final int中的值始终返回大于0的值,或者我应该坚持老式的方式并使用我自己定义的ACCESS_NETWORK_STATE进行许可请求?

编辑我现在意识到published_posts是一个普通级别的权限,我不需要询问用户。但是,主要问题仍然存在。

1 个答案:

答案 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)