ProgressDialog表示中の画面回転について

2,205 views
Skip to first unread message

Tad

unread,
Jan 12, 2011, 6:58:37 AM1/12/11
to 日本Androidの会
時間のかかる処理を行う際、AsyncTaskを用いて別スレッドで処理をしています。
AsyncTask#onPreExecute内でProgressDialogを生成し、onPostExecuteでProgressDialog
を閉じるように記述しています。
ProgressDialogを表示中に画面回転が行われると、Activityが破棄されるためProgress表示も消える上、アプリもエラーで終
了してしまいます。

対応として、
1. Activity#onRetainNonConfigurationInstanceでAsyncTaskを保存して新しいActivityに
受け渡し、ProgressDialogも新しく生成してすり替える。
2. Dialog表示中のみ画面回転を無効にし、処理が終了し次第有効に戻す。
といったものを考えました。
1 は大変そうなので 2 で行いたいところなのですが、android:screenOrientationをコード内から動的に設定するやり方がわ
かりません。

私の調べが足りないだけで簡単なことなのかも知れませんが、ご教授いただければと思います。

shirou

unread,
Jan 12, 2011, 8:15:29 AM1/12/11
to 日本Androidの会
shirouと申します。

今手元で試したわけではありませんので、間違ってたらすいません。
たしかActivity.setRequestedOrientation を使うと、動的に画面の向きを変更、固定できたと思います。

現在の画面の向きを Configuration.orientationで検知して、向きを固定、
Dialog終了後、画面の向きの変更を有効にするために
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
を再び設定すると良いのではないかと思います。


http://developer.android.com/intl/ja/reference/android/app/Activity.html#setRequestedOrientation(int)

Kazuya Takeshima

unread,
Jan 12, 2011, 8:25:13 AM1/12/11
to android-g...@googlegroups.com
竹島和弥と申します。

androidManifest.xmlのActivityタグに
android:configChanges="orientation"
を指定してみてはどうでしょうか。

"アクティビティ自身がハンドリングする設定の変更"を設定する属性なのですが、
ここにorientationと記述することで、
画面回転でのアクティビティの破棄/再生成が行われなく(アプリが管理することに)なります。

2011年1月12日20:58 Tad <tad.de...@gmail.com>:

> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
>

Tad

unread,
Jan 12, 2011, 10:18:37 AM1/12/11
to 日本Androidの会
ご助言ありがとうございます。
以下のような形で、実装して試させていただきました。
private class HogeTask extends AsyncTask<String, Integer, Integer> {
private ProgressDialog progressDialog;

protected void onPreExecute() {
~ ダイアログ生成 ~
Configuration config = getResources().getConfiguration();
setRequestedOrientation(config.orientation);

this.progressDialog.show();
}

protected void onPostExecute(Integer result) {
this.progressDialog.dismiss();

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}
}

結果なのですが、Dialog表示時に端末の向きを変えても、画面が回転することはなくなりました。
しかし、Activityはきっちり破棄→生成されるらしく、問題は解決しませんでした。
画面回転を停止すればActivityの破棄を止められると考えた私の認識が甘かったようです。

On 1月12日, 午後10:15, shirou <info.t...@gmail.com> wrote:
> shirouと申します。
>
> 今手元で試したわけではありませんので、間違ってたらすいません。
> たしかActivity.setRequestedOrientation を使うと、動的に画面の向きを変更、固定できたと思います。
>
> 現在の画面の向きをConfiguration.orientationで検知して、向きを固定、
> Dialog終了後、画面の向きの変更を有効にするために
> setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
> を再び設定すると良いのではないかと思います。
>
> http://developer.android.com/intl/ja/reference/android/app/Activity.h...)

なら

unread,
Jan 13, 2011, 3:33:12 AM1/13/11
to 日本Androidの会
奈良と申します。

私も竹島さんと同意見で、androidManifest.xmlのandroid:configChangesを指定するのがよいと思います。
ただ、たしかorientationだけでは不足で、keyboardHiddenも同時に指定する必要があったと記憶しております。
(端末依存かもしれません)

そちらの指定を行うと、端末向きが変わった場合はActivityが破棄されるのではなく、
onConfigurationChanged(Configuration newConfig)が呼ばれますので、そこで適切に
処理(たとえばレイアウトを少し変更したりとか)を実装すればよいと思います。

http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange

Tad

unread,
Jan 13, 2011, 9:01:29 AM1/13/11
to 日本Androidの会
返信ありがとうございます。
この対処方法は見かけたのですが、「アプリ側で管理」というところで、勝手に「レイアウトも自分で作り直したり、もろもろの作業がつきまとうんだろう
な」と思い込んでいました...。
試してみたところ、android:configChanges="orientation" でも、問題なくレイアウトが作り直され、Dialog自
体も表示し続けます。
この方法では、そもそもActivityが破棄されなくなるので、Dialog表示中に画面固定など考えなくても良くなるのですね。

画面回転の度にActivityが破棄されてしまう設定がデフォルトなのは扱いづらい印象です。むしろ、バグの誘因に見えます。しかし、この実装がデ
フォルトになっているのはActivityが破棄されないことで何らかの不都合が有るのでは?と考えてしまうのですが、Googleは何故このような仕
様を選択したのでしょうか?

On 1月12日, 午後10:25, Kazuya Takeshima <mituki1...@gmail.com> wrote:
> 竹島和弥と申します。
>
> androidManifest.xmlのActivityタグに
> android:configChanges="orientation"
> を指定してみてはどうでしょうか。
>
> "アクティビティ自身がハンドリングする設定の変更"を設定する属性なのですが、
> ここにorientationと記述することで、
> 画面回転でのアクティビティの破棄/再生成が行われなく(アプリが管理することに)なります。
>
> 2011年1月12日20:58 Tad <tad.develo...@gmail.com>:

Tad

unread,
Jan 13, 2011, 9:08:50 AM1/13/11
to 日本Androidの会
返信ありがとうございます。
keyboardHiddenは物理キーボード?ということでしょうか。そういった環境がないので確認できませんが、そのように実装させていただくこと
にします。

On 1月13日, 午後5:33, なら <kazuki.n...@gmail.com> wrote:
> 奈良と申します。
>
> 私も竹島さんと同意見で、androidManifest.xmlのandroid:configChangesを指定するのがよいと思います。
> ただ、たしかorientationだけでは不足で、keyboardHiddenも同時に指定する必要があったと記憶しております。
> (端末依存かもしれません)
>
> そちらの指定を行うと、端末向きが変わった場合はActivityが破棄されるのではなく、
> onConfigurationChanged(Configuration newConfig)が呼ばれますので、そこで適切に
> 処理(たとえばレイアウトを少し変更したりとか)を実装すればよいと思います。
>
> http://developer.android.com/guide/topics/resources/runtime-changes.h...
Reply all
Reply to author
Forward
0 new messages