我计划为我所有的 startActivityForResult()
代码使用生成的资源 ID,这样我就可以在基类中使用 onActivityResult()
而不必担心如果派生类使用相同的代码。
不幸的是,代码似乎被限制在 16 位,而资源 ID 是 32 位。有没有办法生成唯一的 16 位 ID?
最佳答案
其实是有的。此外,您可以使用标准 id 作为 Android 资源。只需用 0x0000FFFF
屏蔽您的 ID,然后在任何您想要的地方使用它作为 startActivityForResult()
或 requestPermissions()
的 ID,您可以使用这个简单的效用:
public static int normalizeId(int id){
return id & 0x0000FFFF;
}
为什么?
首先,让我们指出 16 位值限制背后的原因。这是 fragment/Activity 。操作系统强制开发人员使用 16 位,而 ID 是 32 位(作为整数),因为系统总是用 0xffff
屏蔽 id,然后在调用来自 Fragment 时将其转换为 16 (<<16)。所以它是一个标记为 fragment 目标 ID 的唯一 ID。另一方面,通过 Activity 发送的 ID 保持原样,因此它的 Activity 目标 ID。然后当结果出来时,OS 知道发送到哪里是 Fragment 还是 Activity。假设我们有这个 id Id=0x0001
Activity 中 startActivityForResult()
中的 Id 变为(无变化):
Id=0x0001
Fragment 中 startActivityForResult()
中的 Id 变为:
Id=0xFFFF0001
现在我们怎么可以忽略前 16 位?让我们看一下 Android 中任何资源的 id 的剖析。它由三部分组成,作为 HEX 值构造:
PPTTVVVV
PP:表示包id。其中有两个:
- 0x01(系统包ID)
- 0x7f(应用程序包 ID)
TT:代表类型Id。即:
- 0x0b : 数组
- 0x01 : 属性
- 0x0c : 维度
- 0x10 : 颜色
- 0x0e : bool 值
- 0x02:可绘制
- ..等
VVVV:表示特定包id下特定类型资源的真实唯一标识。
正如您现在看到的,忽略代表 PPTT
的前 16 位不会对您的应用产生影响或导致与 ID 冲突。所以安全地只使用 VVVV
部分,它是 startActivityForResult()
或 requestPermissions()
希望对您有所帮助,'。
关于android - 在 Android 中为 startActivityForResult() 生成 16 位唯一 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38072322/