我打算爲我所有的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()
我希望可以幫助你,'。