我打算为我所有的startActivityForResult()
代码使用生成的资源ID,以便我可以在基类中使用onActivityResult()
,而不必担心派生类是否使用相同的代码。在Android中为startActivityForResult()生成16位唯一ID
不幸的是,代码似乎只限于16位,资源ID是32位。有没有办法生成唯一的16位ID?
我打算为我所有的startActivityForResult()
代码使用生成的资源ID,以便我可以在基类中使用onActivityResult()
,而不必担心派生类是否使用相同的代码。在Android中为startActivityForResult()生成16位唯一ID
不幸的是,代码似乎只限于16位,资源ID是32位。有没有办法生成唯一的16位ID?
其实有。此外,您可以使用标准ID作为Android资源。只是简单地掩盖你的ID与0x0000FFFF
和无论你想为startActivityForResult()
或requestPermissions()
ID,你可以使用这个简单的工具,使用它:
public static int normalizeId(int id){
return id & 0x0000FFFF;
}
为什么?首先,让我们把这个限制背后的原因指向16位vlaue。它是片段/活动。 OS强制开发人员使用16位,而ID是32位(如整数),因为系统始终使用0xffff
掩码ID,然后在来自Fragment的呼叫来自16时调用它(< < 16)。所以它是一个唯一的ID标记为片段目标ID。另一方面,通过活动发送的ID保持原样,所以它的活动目标ID。然后当结果出来时,OS知道去哪里发送片段还是活动。比方说,我们有这个ID Id=0x0001
标识在活动startActivityForResult()
成为(无变化):
Id=0x0001
标识在片段startActivityForResult()
变为:
Id=0xFFFF0001
现在怎么弄,我们可以只忽略第一个16位?让我们来看看Android中任何资源的id的解析。它构成的三个部分,HEX值构造:
PPTTVVVV
PP:表示包ID。有其中的两个:
TT:表示类型ID。即:
VVVV:代表特定包ID下特定资源类型的真正唯一标识。
正如您现在所看到的,忽略代表PPTT
的第一个16位不会影响您的应用程序或导致与ID冲突。所以只能安全使用VVVV
部分,这是16位值的startActivityForResult()
或requestPermissions()
我希望可以帮助你,'。