0

do_something()デバイスが縦向きから横向きに回転するときはいつでもしたいです。

<activity android:configChanges="orientation" >マニフェストに追加しました。そのonConfigurationChanged()ため、デバイスを回転させるたびに呼び出されます。また、アクティビティは再作成されません。

私のonConfigurationChanged()職務では:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        do_something();
    }
    then_fire_off_the_screen_rotation_as_normal();
    // which means re-start the Activity
    // i expect it will fire off onSaveInstanceState() -> onPause() -> onStop() -> onDestroy() -> onCreate() -> onStart() -> onRestoreInstanceState() -> onResume()
}

私の問題は、私はで何ができるかわからないということですthen_fire_off_the_screen_rotation_as_normal()

私は使ってみsetRequestedOrientation()ましたが、それはこの目的を果たす機能ではないようです:

ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED、、、ActivityInfo.SCREEN_ORIENTATION_SENSORまたはを渡してActivityInfo.SCREEN_ORIENTATION_USERも、アクティビティはまだ再開されません。(電話しないように。)

通過するActivityInfo.SCREEN_ORIENTATION_NOSENSORと、方向センサーがオフになりました。(それが言ったように。)

を渡すとActivityInfo.SCREEN_ORIENTATION_LANDSCAPE、アクティビティはで強制終了しましAndroidRuntime:NullPointerExceptionた。


(具体的には、ポートレートレイアウトにはプログラムで追加されたフラグメントがありますが、ランドスケープレイアウトdo_something()にはないためです。関数では、ランドスケープモードでは必要ないため、これらのフラグメントを削除します。)

4

2 に答える 2

4

まあ、私はこの簡単な方法が私がしたいことを提供できると思います:

追加しないで<activity android:configChanges="orientation" >ください。オーバーライドする必要がないことを意味しonConfigurationChanged()ます。

onSaveInstanceState()

@Override
protected void onSaveInstanceState(Bundle outState) {
    if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
        do_something();
    }
    super.onSaveInstanceState(outState);
}

do_something() *前に 必ず確認してくださいsuper.onSaveInstanceState()

(私の場合、フラグメントをレイアウトとアクティビティから削除します。それ以降の場合super.onSaveInstanceState()、レイアウトはすでにバンドルに保存されています。その後、アクティビティの再作成後にフラグメント再作成されます。 ###)

###私はこの現象を証明しました。しかし、アクティビティの再作成時にフラグメントの復元を決定する理由は何ですか?私の推測によるものです。それについて何かアイデアがあれば、私の別の質問に答えてください。ありがとう!


さて、最初のコメントで提起された問題を修正する上記の方法のさらなる改善:(まだ単純です)

@Override
protected void onSaveInstanceState(Bundle outState) {
    if (isPortrait2Landscape()) {
        do_something();
    }
    super.onSaveInstanceState(outState);
}

private boolean isPortrait2Landscape() {
    return isDevicePortrait() && (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE);
}

そして、次のisDevicePortrait()ようになります:

private boolean isDevicePortrait() {
    return (findViewById(R.id.A_View_Only_In_Portrait) != null);
}

*デバイスが現在文字通りポートレートであるかどうかを判断するために使用できないことに注意してください。画面が回転した直後にオブジェクトが変更されたためです-呼び出される前でも!!getResources().getConfiguration().orientationResources onSaveInstanceState()

向きのテストに使用したくない場合findViewById()(何らかの理由で、結局のところそれほどきれいではありません)、グローバル変数private int current_orientation;を保持し、で初期化しcurrent_orientation = getResources().getConfiguration().orientation;ますonCreate()。これはすっきりしているようです。ただし、アクティビティのライフサイクル中はどこでも変更しないように注意する必要があります。

于 2013-03-26T16:46:37.867 に答える
1
 // which means re-start the Activity
 // i expect it will fire off onSaveInstanceState() -> onPause() -> onStop() -> onDestroy() -> onCreate() -> onStart() -> onRestoreInstanceState() -> onResume()

onPause()、onStop()などが起動するというこの仮定は正しくありません。を使用onConfigurationChangedすることで、Androidにこれらの手順を実行しないように指示します。代わりに、一時変数でのレイアウトに関する情報の保存を処理し、を呼び出してInitializeUI()、レイアウトを希望どおりに設定します。私が持っているものの例を投稿します。これは似ていて、すぐに私のために働いています。

編集:これがサンプルです

@Override
public void onConfigurationChanged(Configuration newConfig){
    super.onConfigurationChanged(newConfig);
    setContentView(R.layout.main);
    Log.i("configChange", "configChange");

    String tmp = connect.getText().toString();
    boolean onTmp = on.isEnabled();
    boolean offTmp = off.isEnabled();
    boolean connTmp = reconnect.isEnabled();

    InitializeUI();

    connect.setText(tmp);
    on.setEnabled(onTmp);
    off.setEnabled(offTmp);
    reconnect.setEnabled(connTmp);
}

今、私のInitializeUI()メソッドは、findViewByIdの束に過ぎず、onClickListenersを取得しています。また、必ずInitializeUI() in youronCreate()`を呼び出してください。

これがいくつかの助けになることを願っています。

于 2013-03-26T15:31:03.727 に答える