5

我需要处理我的 Android 应用程序中的方向更改。为此,我决定使用OrientationEventListener便利类。但是他的回调方法被赋予了一些奇怪的行为。

我的应用程序以纵向模式启动,然后最终切换到横向模式。我在回调onOrientationChanged方法中执行了一些自定义代码,提供了一些额外的 UI 处理逻辑 - 它有一些对findViewById. 奇怪的是,当从横向模式切换回纵向模式时,onOrientationChanged回调被调用了两次,更糟糕的是 - 第二次调用正在处理bad Context -findViewById方法开始返回null。这些调用是直接从MainThread进行的

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    listener = new OrientationListener();
}

    @Override
protected void onResume() {     
    super.onResume();
    // enabling listening
    listener.enable();
}
    @Override
protected void onPause() {
    super.onPause();
    // disabling listening
    listener.disable();
}

我用一个Activity没有任何逻辑的假人复制了相同的行为,除了一个处理方向问题的逻辑。我通过按Ctrl+F11从 Android 2.2 模拟器启动方向切换 可能出了什么问题?

Upd:实现的内部类OrientationEventListener

private class OrientationListener extends OrientationEventListener {
    public OrientationL() {
        super(getBaseContext());
    }

    @Override
    public void onOrientationChanged(int orientation) {

        toString();

    }
}

}

4

3 回答 3

5

这只是模拟器中记录的错误。真实设备不会表现出这种双生命周期事件行为。不久前我遇到了同样的问题,它在真实设备上消失了。

如果您可以通过仅测试一个方向的方向变化直到您拿到物理电话,我建议您忽略这个问题。否则,您可以通过保持一个静态布尔值来“跳过”第二组生命周期调用,以指示您已经完成了第一组。

有关更多信息,请参阅此问题报告

于 2010-06-08T19:36:49.227 回答
3

您是否尝试过使用 onConfigurationChanged?

@Override
public void onConfigurationChanged(Configuration newConfig) {
 if(newConfig.equals(Configuration.ORIENTATION_LANDSCAPE)…
于 2010-06-07T09:17:56.210 回答
1

在活动标签的清单文件中添加android:configChanges="orientation"

<activity android:label="@string/app_name" android:configChanges="orientation" android:name=".com.androidpeople">

于 2010-11-10T11:43:42.457 回答