1

Android アプリにはActivity、向きに応じてビューとして異なるレイアウト XML を設定する があります。私はandroid:configChanges="orientation"マニフェストで宣言しました。NowonConfigurationChanged()が呼び出されますが、このときまでに、新しい向きはすでに有効になっています。

私の目標は、ライフサイクルに接続して、新しい向きが有効になるにいくつかの変更を保存することです。現在の向きに戻ったときに状態を復元できるようにします。

次のようにハッキングしましたが、これが正しい方法かどうかはわかりません。私の手順では、状態を保存してonConfigurationChanged()から、呼び出しsetContentView()て新しい向きのレイアウトを設定します。

public class SwitchOrientationActivity extends Activity {

    private View mLandscape, mPortrait;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        LayoutInflater li = LayoutInflater.from(this);
        mLandscape = li.inflate(R.layout.landscape, null);
        mPortrait = li.inflate(R.layout.portrait, null);
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);

        if (Configuration.ORIENTATION_LANDSCAPE == newConfig.orientation) {
            switchToLandscape();
        } else {
            switchToPortrait();
        }
    }

    private void switchToPortrait() {

        /*
         * Use mLandscape.findViewById() to get to the views and save the values
         * I'm interested in.
         */
        saveLanscapeState();
        setContentView(mPortrait);
    }

    private void switchToLandscape() {
        /*
         * Use mPortrait.findViewById() to get to the views and save the values
         * I'm interested in.
         */
        savePortraitState();
        setContentView(mLandscape);

    }
}

これを達成するためのよりエレガントな方法はありますか?

4

1 に答える 1

0

android:configChanges="orientation"方向の変更時にアクティビティが再開されないため、通常のライフサイクルをスキップします。それを取り出してからonRetainNonConfigurationInstance () を実装し、onCreate または onRestoreInstanceState のいずれかで状態を復元することをお勧めします。詳細については、この記事を参照してください

于 2012-02-14T04:18:47.890 に答える