1

ログイン ボタンを持つアクティビティがあり、ログイン ボタンには asynctask があり、タスクが開始される前に読み込み中の AlertDialog を表示し、終了するとダイアログを閉じて別のアクティビティに戻ります。

向きの変更を処理するために必要ですが、スレッドの実行中に向きが変更されるとフラグメントが破棄され、DialogFragment.dismiss を呼び出すとonPostExecute()null ポインター例外が発生します。私は何をすべきか?

PreExecute で

FragmentManager fm = getFragmentManager();
TestDiag alertFrag = new TestDiag();
alertFrag.show(fm, "Alert_Dialog");

PostExecute() で

FragmentManager fm = getFragmentManager();
TestDiag alertFrag2= (TestDiag) fm.findFragmentByTag("Alert_Dialog");
alertFrag2.dismiss();

編集:retain instance trueを設定しようとしましたが、機能しますが、機能しません。

4

1 に答える 1

1

AsyncTask が完了するまで、onPreExecute() -> ロックおよび onPostExecute() -> リリースするまで、向きをロックするだけです。

public class Device {

public static void lockOrientation(Activity activity) {
    Display display = ((WindowManager) activity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
    int rotation = display.getRotation();
    int tempOrientation = activity.getResources().getConfiguration().orientation;
    int orientation = 0;
    switch(tempOrientation)
    {
    case Configuration.ORIENTATION_LANDSCAPE:
        if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90)
            orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
        else
            orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
        break;
    case Configuration.ORIENTATION_PORTRAIT:
        if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_270)
            orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
        else
            orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
    }
    activity.setRequestedOrientation(orientation);
}





public static void releaseOrientation(Activity activity) {
    activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}

}

タスクの実行中に方向の変更を本当に許可したい場合:進行状況ダイアログとデバイスの回転で AsyncTask を使用します。

于 2013-09-27T23:37:50.990 に答える