configChanges を使用して向きの変更を手動で処理することを指定せずにダイアログを管理する方法を、私の人生では理解できません。だから、あなたがこの AndroidManifest を持っているとしましょう:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.testandroid"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
次の MainActivity.java を使用します。
package com.example.testandroid;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.Dialog;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
public class MainActivity extends Activity {
private final static String TAG = "MainActivity";
Dialog mDialog = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate");
setContentView(R.layout.activity_main);
}
public void doShowDialog(View b) {
Log.d(TAG, "doShowDialog");
showDialog(1);
}
private void tryDismiss() {
Log.d(TAG, "tryDismiss");
try {
dismissDialog(1);
removeDialog(1);
mDialog.dismiss();
} catch(IllegalArgumentException ex) {
Log.e(TAG, ex.getMessage());
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
@Override
protected void onPause() {
tryDismiss();
super.onPause();
Log.d(TAG, "onPause");
}
@Override
protected Dialog onCreateDialog(int dialog) {
Builder b = new AlertDialog.Builder(this);
b.setTitle("Hello").setMessage("Waiting..");
mDialog = b.create();
return mDialog;
}
}
そしてこのレイアウト(main.xml)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Open Dialog"
android:onClick="doShowDialog"
/>
</LinearLayout>
onDestroy から呼び出すか onPause から呼び出すかは関係ないようです。方向が切り替わった後、ダイアログが再び表示されます。しかし、なぜ?私はそれを去るように言いました。removeDialog/dismissDialog を呼び出すと、向きが変わる前に呼び出されても何もしません。これがなぜなのか、一生わからない。私が知っているこれを取り除く唯一の方法は、次を使用して向きの変更を自分で処理することです
android:configChanges="keyboardHidden|orientation"
新しい作業方法は、まだアップグレードしていない FragmentDialog のものを使用することであり、そのためにアプリ全体を書き直す準備ができていません。これが機能しないのは奇妙に思えます。
これは、ユーザーが (スピナーのデータを更新するために) リモート サーバーから一部のデータを取得するように要求できるアプリで発生している現実世界の問題の例にすぎず、方向を切り替えると、読み込みダイアログが消えません。 android:configChanges オプションで向きの変更を処理する以外に、これに対する修正はないようです。私にはできることですが、それをしなければならないのはばかげているように思えます。
-- 更新 -- ダイアログを閉じるボタンを削除しました。これは不要であり、ダイアログが一番上にあるためクリックすることはできません。
再現するには、アプリを起動し、ダイアログを開くボタンをクリックしてから、携帯電話を回転させます。