java.lang.IllegalArgumentException:对于requestCode只能使用低16位

CoD*_*oDe 38 android start-activity

我正在编写一个Activity A启动Activity B使用的应用程序

startActivityForResult(intent, -101);
Run Code Online (Sandbox Code Playgroud)

但是在调用时,它会回复以下错误日志:

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)
Run Code Online (Sandbox Code Playgroud)

可能它可能是-101但我不确定.有没有人对此有任何想法?

Hen*_*nry 120

只有在android.support.v4.app.FragmentActivity使用时才能获得此异常,而不是在使用时android.app.Activity.

startActivityForResult()in FragmentActivity要求requestCode为16位,表示范围为0到65535.

此外,validateRequestPermissionsRequestCodein FragmentActivity要求requestCode为16位,意味着范围为0到65535.

有关详细信息(如果要查看源代码):https://stackoverflow.com/a/33331459/4747587

  • 谢谢亨利,这是一个更完整的答案 (3认同)

Sau*_*rat 75

如果您使用的是ActivityResultAPI,请添加此依赖项以解决此问题:

implementation "androidx.fragment:fragment:1.3.4"
Run Code Online (Sandbox Code Playgroud)

  • 不知怎的,我真的不知道为什么。但是,您应该将这两个依赖项添加在一起。实现 'androidx.activity:activity-ktx:xxx' 实现 'androidx.fragment:fragment-ktx:xxx' (2认同)

van*_*art 26

还可以提一下,如果使用大于2 ^ 16/2的数字(即32768),可能会发生这种情况,因此基本上有2 ^ 15个选项可以不搞砸.

说明:16位可以代表65536个数字之一,但是,其中一半是负数.


Ste*_*his 25

你需要传递一个正数startActivityForResult.

  • 尽管这是事实,但以下答案更为具体。+1 (2认同)

Sha*_*aon 25

对于使用新 ActivityResult API 的用户,

如果你使用新的方式(ActivityResult)打开新的Activity。

registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { 
    result ->
}
Run Code Online (Sandbox Code Playgroud)

您必须同时使用以下两个依赖项

implementation 'androidx.activity:activity-ktx:1.2.0-rc01'
implementation 'androidx.fragment:fragment-ktx:1.3.0-rc02'
Run Code Online (Sandbox Code Playgroud)

  • 在不使用片段实现的情况下使用它有点奇怪。但它与它一起工作 (6认同)
  • @Shaon我不得不让你失望..他们没有 (2认同)

ONE*_*ONE 10

您只能使用低16位的requestCode - 二进制 - 您可以使用

0000000000000000 (16 bits) to 1111111111111111 (16 bits).

在十进制("数字")术语中,这允许2^16 = 65536组合.因此,您只能使用数字0一直到65535.

你也不能使用负数.