J'écris une application où Activity A
lance Activity B
en utilisant
startActivityForResult(intent, -101);
mais lorsqu'il a été appelé, il a répondu avec le journal d'erreurs suivant:
E/AndroidRuntime( 1708): Java.lang.IllegalArgumentException: Can only use lower 16 bits for requestCode
E/AndroidRuntime( 1708): at Android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.Java:837)
Cela pourrait probablement être -101 mais je ne suis pas sûr. Quelqu'un a-t-il une idée à ce sujet?
Vous devez passer un nombre positif à startActivityForResult
.
Vous obtenez cette exception uniquement dans Android.support.v4.app.FragmentActivity
et pas lorsque vous utilisez Android.app.Activity
.
startActivityForResult()
dans FragmentActivity
exige que la requestCode
soit de 16 bits, ce qui signifie que la plage va de 0 à 65535.
De plus, validateRequestPermissionsRequestCode
dans FragmentActivity
exige que requestCode
soit de 16 bits, ce qui signifie que la plage est comprise entre 0 et 65535.
Pour plus d'informations (si vous souhaitez voir le code source): https://stackoverflow.com/a/33331459/4747587
Il est également bon de mentionner que cela peut arriver si vous utilisez un nombre supérieur à 2 ^ 16/2 (soit 32768). Il existe donc fondamentalement 2 ^ 15 options pour ne pas gâcher cela.
Explication: 16 bits peuvent représenter l’un des 65 536 nombres, mais la moitié d’entre eux sont négatifs.
Vous ne pouvez utiliser que les 16 bits inférieurs pour les moyens requestCode - en termes binaires - vous pouvez utiliser
0000000000000000 (16 bits) to 1111111111111111 (16 bits)
.
En termes décimaux ("nombre"), cela permet des combinaisons 2^16 = 65536
. Par conséquent, vous ne pouvez utiliser que les chiffres 0 dans 65535.
Vous ne pouvez pas non plus utiliser de nombres négatifs.
La bonne réponse est que vous devriez utiliser un nombre de 16 bits à cette fin. La solution la plus sûre consiste à toujours définir le code de votre demande sur short
. Si le programmeur tente d'écrire un nombre supérieur à 16 bits, le IDE ne vous laissera pas continuer car il y aura une erreur.