3

我有一个中等复杂的 Android 应用程序,我通过 onConfigurationChanged 自己处理轮换,而不是重新启动活动。使用设备或模拟器一段时间(多次旋转)后,我开始看到应用程序间歇性地布局不正确(在横向模式下它保持纵向宽度)

我向活动中的所有“onAction”事件添加了跟踪日志记录语句,我看到了两个不同的流程:

正确的:

  1. onConfigurationChanged
  2. onMeasure (旧宽度)
  3. 布局
  4. onMeasure (使用新宽度)
  5. onSizeChanged
  6. 布局
  7. 绘制

当布局不正确时,我看到了这个流程

不正确:

  1. onMeasure (使用新宽度)
  2. onSizeChanged
  3. 布局
  4. 绘制
  5. onConfigurationChanged
  6. onMeasure (使用新宽度)
  7. 布局
  8. 绘制

查看发送的消息,我想我看到了问题的一部分:我看到 3 条重要消息被发布:

  • MessageType 1003 --> mWinFrame 的新大小
  • MessageType 1000 --> New Measure/Layout pass(使用 mWinFrame 的大小)
  • MessageType 118 --> 配置更改,启动 onConfigurationChanged。

当布局正确时,顺序似乎是 118、1003、1000。当布局错误时,顺序似乎是 1003、1000、118,因此在 onConfigurationChanged 发生之前使用新宽度进行测量。

对于额外的混淆,当布局不正确时,当我附加层次结构查看器并转储层次结构时,它会立即变得正确,但无论我在 onPreDraw 中请求重新布局和/或无效多少次,它都不会变得正确。

问题:

1) 即使给出了无序调用,我最终还是得到了 onConfigurationChanged 并请求重新布局,这发生在新的宽度和高度上,为什么这不会导致屏幕上的更新?

2) 为什么这些消息的发布顺序会随着时间而改变?我从来没有在新启动时看到过这个,但是当手机/模拟器已经“运行了一段时间”时开始看到它。

4

1 回答 1

0

这似乎更常发生在速度较慢的手机上,规避它的一种方法是在 onPause() 中执行一个可怕的 kludge... setVisible(false) 并发布一个 Runnable 来执行 setVisible(true) onResume()。

这给了它时间在测量/布局之前注册正确的高度,你的hierarchyviewer线索表明有一种神奇的方法,可能不是这个,但至少它现在似乎用胶带粘住了问题。

于 2011-03-08T20:05:09.370 回答