横向屏幕解锁时错误的布局尺寸膨胀

时间:2014-09-15 17:18:08

标签: android android-layout android-fragments

我们的应用中最常发生的崩溃源于 android.support.v4.app.FragmentManagerImpl.moveToState 。崩溃本身就是:

引起:java.lang.IllegalArgumentException:找不到片段片段{41f0b5f8#0 id = 0x7f080000 some_fragment} 的id 0x7f080000(com.fragmentcrash.fragmentmanagerimplcrash:id / some_fragment_container)的视图p>

值得庆幸的是,这一行包含所涉及的布局的ID以及所涉及的片段的标记,这允许我们(最终)复制崩溃。这有助于我们将其缩小到特定的活动,我能够在我的Nexus 7上复制它,但不能在任何小型设备上复制它。此崩溃的Crashlytics页面证实了这一点:它只发生在sw> = 600dp设备(Nexus 7,Galaxy Tab 3,Galaxy Tab 10等)上。重现的确切步骤如下:

  1. 打开应用程序(任何方向)。
  2. 锁定屏幕。
  3. 确保设备处于横向。
  4. 解锁屏幕。
  5. 当您按下解锁按钮时(即,当应用程序返回到前台之前,当您看到设备的解锁屏幕时)会发生崩溃。那么,应用程序正在做些什么来实现这一目标?我们为此Activity提供了两种布局,一种位于 layout / ,另一种位于 layout-sw600dp-port / 中。活动通过AndroidManifest.xml中的条目以纵向方式锁定。 sw600dp布局有一个FrameLayout,可以用作编程添加的Fragment的容器,而常规尺寸的布局则不会。如果最小宽度为600dp(在运行时确定),则仅创建并附加片段。奇怪的是,如果将FrameLayout添加到常规大小的布局( layout / 中的布局),则崩溃将不再发生。 看来,在没有sw600dp横向布局的情况下,基础布局正在膨胀,即使它应该使用纵向布局,因为活动仅限于纵向,即使它不是技术上的在前景中。值得注意的是,只有在横向解锁屏幕时才会发生这种情况 - 如果您在前台运行应用程序并只是将设备旋转到横向,则没有任何反应。这很容易修复(我们最终为该Activity实现了我们预期的横向布局,这是初始布局在 layout-sw600dp-port / 而不仅仅是 layout-sw600dp的全部原因/ )。但是,我很想知道它为什么会发生这种情况。

    为什么Android在应用指定的方向限制之前似乎会夸大错误的布局,为什么在用户关闭其锁定屏幕之前就会发生这种情况?

    如果你想为自己复制这次崩溃,我已经完成了project的最低要求。只需在平板电脑上运行它(我只能在第一代Nexus 7上测试它),然后按照上面的重复步骤进行操作。

0 个答案:

没有答案