2

xml で次のように定義されたプログレス バー (ぐるぐる待っているスタイル) があります。

<ProgressBar
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        style="@android:style/Widget.Holo.ProgressBar.Large"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"
        android:id="@+id/progress"
        />

を使用して、アクティビティのonCreateメソッドで可視性を非表示にします。

progressBar.setVisibility(View.GONE);

を使用してボタンのonClickイベントで開始します

progressBar.setVisibility(View.VISIBLE);

画面の向きを変更すると、進行状況バーが消えます。方向を変更するとアクティビティが破棄されて再作成され、アクティビティの状態が保存された から新しい方向で再作成されることを理解していBundle savedInstanceStateます。Android によって保存されたデフォルトには、 View オブジェクトBundleに加えられた変更が含まれていないと私は考えていますか?ProgressBar

この場合、向きの変更後に の正しい可視性を回復する唯一の方法は、メソッドをオーバーライドし、このフラグを検査してそれに応じて可視性を設定することによりProgressBar、フラグを保存することです (例: )。または、ビューオブジェクトの状態を保存することについて本当に明白な何かが欠けていますか?boolean pbState = false/trueonSaveInstanceStateonRestoreInstanceState

ありがとう

アップデート:

以下に示す両方のソリューションが機能します。android:configChanges="orientation|screenSize"マニフェスト xml ファイルを入れることにしました。ただし、ドキュメントには、この方法は最後の手段としてのみ使用する必要があると記載されています。私のアクティビティはかなり単純なので、マニフェスト xml メソッドは、メイン アクティビティで必要なコードの量を減らします (つまり、onRestoreInstanceStateメソッドはありません)。アクティビティがより複雑な場合は、後者の方法を使用して状態の変更を明示的に定義することをお勧めします。

4

3 に答える 3

7

それで、アンドロイドによって保存されたデフォルトのバンドルには、ProgressBar View オブジェクトに加えられた変更が含まれていないと考えるのは正しいですか?

あなたが正しいです。progressBarAndroid は の状態やその他のウィジェットを保存しません。

[Is] 向きの変更後に ProgressBar の正しい可視性を回復する唯一の方法は、メソッド onSaveInstanceState をオーバーライドし、onRestoreInstanceState でこのフラグを調べて設定することにより、フラグ (ブール値の pbState = false/true など) を保存することであると言うのは正しいですそれに応じて可視性?

絶対。About onRestoreInstanceState(Bundle): このメソッドをオーバーライドしなくても実行できます。向きの変更を確認するには、savedInstanceState ==> Bundle passed to onCreate(Bundle)に対してを確認しnullます。向きの変更が発生した場合、savedInstanceStatenull にはなりません。アクティビティの開始時に、 にsavedInstanceStateなりますnull。次のコード(基本的にはあなたが提案したものです)が仕事をするはずです:

グローバルブール変数を宣言します。

boolean progressBarIsShowing;

あなたのonCreate(Bundle)

// savedInstanceState != null ===>>> possible orientation change 
if (savedInstanceState != null && savedInstanceState.contains("progressbarIsShowing")) {

    // If `progressBarIsShowing` was stored in bundle, `progressBar` was showing
    progressBar.setVisibility(View.VISIBLE);

} else {

    // Either the activity was just created (not recreated), or `progressBar` wasn't showing
    progressBar.setVisibility(View.GONE);

}

を表示するときは常にprogressBarに設定progressBarIsShowingtrueます。そして、閉じるときに切り替えますprogressBar

オーバーライドonSaveInstanceState(Bundle):

if (progressBarIsShowing) {
    outState.putBoolean("progressBarIsShowing", progressBarIsShowing);
}

注意: ユーザーがいつあなたのアクティビティから離れてブラウジングしたかを確認してください (ホームボタンを押すなどして)。ユーザーがそうすると、BadTokenExceptionifが表示される場合があります。progressBar

于 2013-08-21T10:17:13.763 に答える
3

マニフェストのアクティビティ タグ内で次の行を使用します。

<activity android:name="your activity"
        android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>

上記android:configChanges="orientation"では、構成の変更中にアプリケーションの状態を維持します。

于 2013-08-21T10:14:19.413 に答える