2011-01-26 7 views
1

私は一日中このことについて調査しています。アプリがクラッシュするのは、ダイアログが開いているときだけでなく、スピナーが開いているときでもクラッシュします(そして、私が出会ったことのない他のシナリオがあると確信しています)。アラートダイアログが開いて電話(エミュレータ)の向きが変わるとアプリがクラッシュします

onRetainNonConfigurationInstance()とonConfigurationChanged(Configuration newConfig)のいずれかを選択しても、私には役に立ちません。 (たぶん私は間違っている) - 実際には、最初のものを使うことを好みます。

私は質問したい:1つの開いているダイアログボックスまたは開いているスピンナーについては、最初からすべてを作成する必要がありますか?これは方法ですか?たぶんユーザーが向きを変えるかもしれない多くのウィジェットを持つ大きなクラスを再初期化することは無駄です。

plz私にヒントと指導をお願いします。 ありがとうございます。

編集:::

Error code: 

01-25 17:56:48.182: ERROR/WindowManager(312): Activity XXX has leaked window [email protected] that was originally added here 
01-25 17:56:48.182: ERROR/WindowManager(312): android.view.WindowLeaked: Activity XXX has leaked window [email protected] that 
was originally added here 
01-25 17:56:48.182: ERROR/WindowManager(312):  at android.view.ViewRoot.<init>(ViewRoot.java:247) 
01-25 17:56:48.182: ERROR/WindowManager(312):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148) 
01-25 17:56:48.182: ERROR/WindowManager(312):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
01-25 17:56:48.182: ERROR/WindowManager(312):  at android.view.Window$LocalWindowManager.addView(Window.java:424) 
01-25 17:56:48.182: ERROR/WindowManager(312):  at android.app.Dialog.show(Dialog.java:241) 
01-25 17:56:48.182: ERROR/WindowManager(312):  at XXX.menuGroupDialog(XXX.java:946) 
0 1-25 17:56:48.182: ERROR/WindowManager(312):  at XXX.onOptionsItemSelected 
(GroupManagement.java:257) 
01-25 17:56:48.182: ERROR/WindowManager(312):  at android.app.Activity.onMenuItemSelected(Activity.java:2195)01-25 17:56:48.182: ERROR/WindowManager(312):  at 
com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:730) 
01-25 17:56:48.182: ERROR/WindowManager(312):  at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:143) 
01-25 17:56:48.182: ERROR/WindowManager(312):  at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:855) 
01-25 17:56:48.182: 
ERROR/WindowManager(312):  at com.android.internal.view.menu.IconMenuView.invokeItem(IconMenuView.java:532) 
01-25 17:56:48.182: ERROR/WindowManager(312):  at com.android.internal.view.menu.IconMenuItemView.performClick(IconMenuItemView.java:122) 
01-25 17:56:48.182: ERROR/WindowManager(312):  at android.view.View$PerformClick.run(View.java:8816) 
01-25 17:56:48.182: ERROR/WindowManager(312):  at 
android.os.Handler.handleCallback(Handler.java:587) 
01-25 17:56:48.182: ERROR/WindowManager(312):  at android.os.Handler.dispatchMessage(Handler.java:92) 
01-25 17:56:48.182: ERROR/WindowManager(312):  at android.os.Looper.loop(Looper.java:123) 
01-25 17:56:48.182: ERROR/WindowManager(312):  at 
android.app.ActivityThread.main(ActivityThread.java:4627) 
01-25 17:56:48.182: ERROR/WindowManager(312):  at java.lang.reflect.Method.invokeNative(Native Method) 
01-25 17:56:48.182: ERROR/WindowManager(312):  at java.lang.reflect.Method.invoke(Method.java:521) 
01-25 17:56:48.182: ERROR/WindowManager(312):  at 
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
01-25 17:56:48.182: ERROR/WindowManager(312):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
01-25 17:56:48.182: ERROR/WindowManager(312):  at 
dalvik.system.NativeStart.main(Native Method) 

は、私は、これは()関数を却下呼び出しからのものであることを知っています。ダイアログを開いたときの向きの変更はどのように処理できますか?

+0

ポストエラーメッセージしてください – WarrenFaith

+0

コードしてください!!!!! – the100rabh

答えて

5

AyncTaskにprogressDialog.show()progressbarDialog.dismiss()を使用していますか?

はいの場合は、showDialog(id)dismissDialog(id)をAyncTaskの代わりに使用してみてください。読み込みダイアログを表示するには、onCreateDialog()にカスタムダイアログを書き込む必要があります。 showDialogメソッドとdismissDialogメソッドは、アクティビティレベルのメソッドです。私は彼らがアクティビティまたはそのコンテキスト上で呼び出されることを意味します。そのため、オリエンテーション変更後にアクティビティが再作成された場合でも、最新のコンテキストがダイアログに表示されます。

サンプルコードhere.をご確認ください。お客様の要件に応じてDIALOG_PROGRESSケースを変更してください。

また、onRetainNonConfigurationInstance()は方向変更に完全に機能します。窓漏れの問題があるため、見ることができません。

+0

ありがとう、これはまさに私が探していたものでした。実際に私は間違った場所にダイアログ(私のケースではAlertDialog)を作成し、間違った場所に再度表示していました。すべてが正しく動作していますが、私はダイアログを閉じるためにdismissDialog(id)を使用していません。単純なdialog.dismiss()を使用しました。 –

+0

dialog.dismiss()が原因でウィンドウリークの問題が発生しました。だから私はそれが動作しないと思う。 – MegaMind

+0

はい、dismissDialog(id)に変更しました。実際には、showDialog(id)によってダイアログが呼び出されるたびにdismissDialog(id)によって閉じられる必要があります。 –

1

オリエンテーションが変更されると、デフォルトでアクティビティは破棄され、再作成されます。これをオフにして、configChanges属性を設定することで、この設定を自分で変更することができます。

1

こともできますし無効の設定変更、すなわち、あなたのマニフェストファイルにXMLを使用して、電話機の向きが変わるいったん再描画しようとしてから、アプリケーションを停止することができます:

<activity android:name=".Main" 
android:label="@string/app_name" 
android:screenOrientation="portrait" 
android:configChanges="orientation|keyboardHidden"> 

ときの向きあなたの携帯電話の変更のデフォルトでは、Androidはあなたのページを再インスタンス化しようとします。

+0

私は異なるレイアウトを持っていない場合、これは完璧な解決策になります。しかし、私はこの活動のために2つのレイアウトを持っています。 –

0

私は非常によく似た問題を抱えていましたが、私はそれをマニフェストの活動度attrの小さな変化で解決します。アンドロイド:から configChanges = "方向" へ:アンドロイド:configChanges = "keyboardHidden |オリエンテーション"

はこちらを参照してください。Spinner drop-down list and screen orientation change problem

関連する問題