代码之家  ›  专栏  ›  技术社区  ›  Michael Dodd

强制从ids生成正整数。xml

  •  0
  • Michael Dodd  · 技术社区  · 6 年前

    最近,我养成了在中为请求ID创建常量的习惯 res/values/ids.xml 减少混乱并确保每个请求都是真正唯一的。例如,我可以将自定义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(was-1100091)

    我可以通过将ID包装在 Math.abs() 打电话,但这似乎有点老套。如果我试图检查 请求代码 在里面 onRequestPermissionsResult() 使用 switch 声明为 Math.abs(R.id.permission_request) 不是常量值。

    那么,有没有办法确保 ID。xml 总是返回一个大于0的值,或者我应该坚持旧式的方法并使用 private static final int 由我自己定义的权限请求?

    编辑 我现在意识到 ACCESS_NETWORK_STATE 是一个普通级别的权限,我不需要向用户请求。然而,主要问题仍然存在。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Ben P.    6 年前

    我没有文档来支持这一点,但我的理解是,每个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) 我认为这是相当沉重的负担。