8

我正在开发一个只能在纵向模式下运行的 android 应用程序,因为布局不适合手机的横向屏幕。但是,在平板电脑和上网本上,我希望该应用程序仅在横向模式下运行。

我现在尝试检查应用程序是否在平板设备上运行,并通过 setRequestedOrientation 设置相应的请求方向。

问题是当设备尚未保持在我请求的方向时,应用程序现在崩溃,因为我在调用 setRequestedOrientation 后不久显示了一个progressDialog,这似乎泄漏了一个窗口。

Logcat 说:

10-18 21:15:30.698: E/WindowManager(653): Activity has leaked window  com.android.internal.policy.impl.PhoneWindow$DecorView@41991418 that was originally added here
10-18 21:15:30.698: E/WindowManager(653): android.view.WindowLeaked: Activity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@41991418 that was originally added here
10-18 21:15:30.698: E/WindowManager(653):   at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:279)
10-18 21:15:30.698: E/WindowManager(653):   at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215)
10-18 21:15:30.698: E/WindowManager(653):   at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140)
10-18 21:15:30.698: E/WindowManager(653):   at android.view.Window$LocalWindowManager.addView(Window.java:537)
10-18 21:15:31.888: E/WindowManager(653): Activity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@41588040 that was originally added here
10-18 21:15:31.888: E/WindowManager(653): android.view.WindowLeaked: Activity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@41588040 that was originally added here
10-18 21:15:31.888: E/WindowManager(653):   at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:279)
10-18 21:15:31.888: E/WindowManager(653):   at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215)
10-18 21:15:31.888: E/WindowManager(653):   at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140)
10-18 21:15:31.888: E/WindowManager(653):   at android.view.Window$LocalWindowManager.addView(Window.java:537)
10-18 21:15:34.168: E/AndroidRuntime(653):  at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:599)
10-18 21:15:34.168: E/AndroidRuntime(653):  at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:336)
10-18 21:15:34.168: E/AndroidRuntime(653):  at android.view.WindowManagerImpl$CompatModeWrapper.removeView(WindowManagerImpl.java:151)

我能做些什么来防止这种崩溃?任何帮助将不胜感激。

编辑:由于我无法解决这个问题,我终于设法编辑我的布局,以便它现在允许在纵向和横向模式下使用。

4

2 回答 2

13

你有任何可以显示的源代码吗?这可以帮助确定问题。

我实际上有完全相同的问题。但这只发生在我的一些活动中。

当屏幕方向改变时,Android 实际上会销毁并重新创建活动。

所以,我的代码看起来像这样。

   @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

        setContentView(R.layout.displayscreen);

        bottomButton = (Button) findViewById(R.id.bottomButton);
        bottomButton.setOnClickListener(bottomButtonClick);
        bottomButton.setTypeface(font);
        bottomButton.setTextSize(16);
}

看看发生了什么是视图没有正确附加到窗口管理器。所以我认为 oncreate 可能不是这样做的最佳地点。

相反,我将它添加到我的简历中并且它有效。像这样:

   @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.displayscreen);

        bottomButton = (Button) findViewById(R.id.bottomButton);
        bottomButton.setOnClickListener(bottomButtonClick);
        bottomButton.setTypeface(font);
        bottomButton.setTextSize(16);
}

@Override
protected void onResume() {
    super.onResume();
    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

不幸的是,这也导致活动仍然被破坏和重新创建。调用 onCreate 和 onResume 两次...不好对吧?

所以要解决这个问题。您必须将此添加到您的 android 清单中以进行活动。

android:configChanges="keyboardHidden|orientation"

一个例子:

<activity 
    android:name="com.Test.Info.DisplayInfo"
    android:configChanges="keyboardHidden|orientation"
    android:label="@string/info">
</activity>

此代码可防止销毁/重新创建循环。

希望这会有所帮助!

干杯

于 2012-10-18T20:33:10.403 回答
9

如果你使用

setRequestedOrientation(SCREEN_ORIENTATION_NOSENSOR);

暂时锁定,并且

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);

解锁屏幕旋转,可能你遇到了以下问题

如果您使用此方法锁定屏幕方向并且设备未处于其默认方向,它将切换到默认方向,破坏并创建您的活动。您的应用程序将崩溃,因为您尝试更新一些破坏的进度对话框。

于 2012-10-18T20:48:02.943 回答