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 を 2 回呼び出す...よくありませんか?

したがって、この問題を修正します。アクティビティの 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 に答える