【问题标题】:java.lang.IllegalArgumentException: Can only use lower 16 bits for requestCodejava.lang.IllegalArgumentException:requestCode 只能使用低 16 位
【发布时间】:2014-10-21 04:45:19
【问题描述】:

我正在编写一个应用程序,其中 Activity A 使用

启动 Activity B
startActivityForResult(intent, -101);

但是当被调用时,它会返回以下错误日志:

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)

可能是 -101,但我不确定。有人对此有任何想法吗?

【问题讨论】:

  • 把-101改成正数?
  • requestCode 只能使用低 16 位:表示请求代码应该 >0 try startActivityForResult(intent, 101);
  • 试试这个解决方案:stackoverflow.com/a/44271392/2267723

标签: android start-activity


【解决方案1】:

只有在 android.support.v4.app.FragmentActivity 中才会出现此异常,而在使用 android.app.Activity 时不会出现此异常。

FragmentActivity 中的startActivityForResult() 要求requestCode 为16 位,即范围为0 到65535。

另外,FragmentActivity 中的 validateRequestPermissionsRequestCode 要求 requestCode 为 16 位,这意味着范围是从 0 到 65535。

更多信息(如果您想查看源代码):https://stackoverflow.com/a/33331459/4747587

【讨论】:

  • 谢谢亨利,这是一个更完整的答案
【解决方案2】:

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

implementation "androidx.fragment:fragment:1.3.4"

【讨论】:

  • 谢谢!你真的应该把它放在一个自我回答的问题中,这样其他人就可以很容易地找到它。
  • 不知何故,我真的不知道为什么。但是,您应该将这两个依赖项添加在一起。实现 'androidx.activity:activity-ktx:x.x.x' 实现 'androidx.fragment:fragment-ktx:x.x.x'
  • 为什么他们告诉我们需要多少依赖才能拥有新功能?谷歌文档很烂!顺便感谢您的帮助。
  • 不知道为什么错误不是更具体。无论如何,谢谢你。我的英雄
【解决方案3】:

值得一提的是,如果您使用大于 2^16 / 2(即 32768)的数字,则可能会发生这种情况,因此基本上有 2^15 个选项可以避免搞砸。

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

【讨论】:

  • 限制是 65535 而不是 32768。
  • @Henry 是的,未使用负数
【解决方案4】:

您需要将一个正数传递给startActivityForResult

【讨论】:

  • 虽然这是真的,但下面的答案更具体。 +1
【解决方案5】:

对于使用新的 ActivityResult API 的用户,

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

registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { 
    result ->
}

你必须使用以下两个依赖项

implementation 'androidx.activity:activity-ktx:1.2.0-rc01'
implementation 'androidx.fragment:fragment-ktx:1.3.0-rc02'

【讨论】:

  • 不使用时使用片段实现有点奇怪。但它适用于它
  • 我认为稳定版会解决问题
  • @Shaon 我不得不让你失望.. 他们不会
  • 这一切的变化只会越来越乱。
【解决方案6】:

requestCode 只能使用低 16 位表示——以二进制形式——你可以使用

0000000000000000 (16 bits) to 1111111111111111 (16 bits) [二进制]。

或者,等价

0 to 65535 [ base 10 ].

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

您也不能使用负数。

【讨论】:

    【解决方案7】:

    正确的答案是您应该为此使用 16 位数字。 最安全的解决方案是始终将您的请求代码设置为short。如果程序员尝试写入超过 16 位的数字,那么 IDE 将不会让您继续,因为会出现错误。

    【讨论】:

      【解决方案8】:

      只需添加activityforresult API的两个主要依赖项

      对于科特林

      implementation 'androidx.activity:activity-ktx:1.3.0-alpha03'
      implementation 'androidx.fragment:fragment-ktx:1.3.0'
      

      对于java

      implementation 'androidx.activity:activity:1.3.0-alpha03'
      implementation 'androidx.fragment:fragment:1.3.0'
      

      查看here 获取最新版本。

      【讨论】:

        【解决方案9】:

        只需添加

        对于科特林

        implementation 'androidx.fragment:fragment-ktx:1.3.3'
        

        【讨论】:

          猜你喜欢
          • 2012-12-31
          • 2020-10-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-09
          • 2022-12-21
          • 1970-01-01
          相关资源
          最近更新 更多