Сбой при изменении ориентации DialogFragment с помощью getActivity()

У меня сейчас проблемы с DialogFragments. Я использую последние пакеты поддержки v.4 (вероятно, версия 8) Моя проблема в том, что если ориентация моего телефона меняется, когда диалоговое окно открыто, приложение начинает вести себя странно.

В настоящее время мое приложение работает следующим образом: Есть FragmentActivity, он вызывает Fragment. Затем этот фрагмент вызывает DialogFragment (через getActivity().getSupportFragmentManager().

Если ориентация изменяется, когда диалоговое окно открыто, getActivity() во фрагменте = null. Это вызывает проблему, если я хочу закончить действие и т. д.

Чтобы вызвать это, вы открываете диалоговое окно, меняете ориентацию и нажимаете кнопку. Только после того, как вы нажмете кнопку, он вылетит.

Мой DialogFragment называется AlertDialogFragment:

public class AlertDialogFragment extends DialogFragment {
private static Builder mBuilder;
private static DialogInterface.OnClickListener mListener;

public static AlertDialogFragment newInstance(Context context, DialogInterface.OnClickListener listener) {
    mBuilder = new AlertDialog.Builder(context);
    mListener = listener;       
    return new AlertDialogFragment();
}

//... some functions to set Icons etc

public void setButton(int whichButton, CharSequence buttonText) {
    final DialogInterface.OnClickListener listener = mListener == null ? null : mListener;      
    mBuilder.setPositiveButton(buttonText, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
                listener.onClick(dialog, whichButton);
            }
    });
}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    return mBuilder.create();
}
}

Это фрагмент:

public class TestBedFragment extends Fragment implements DialogInterface.OnClickListener   {
// onCreateView Stuff  

private void showCrashDialog() {
    FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
    AlertDialogFragment newDialog = AlertDialogFragment.newInstance(getActivity(), this);
    newDialog.setTitle("Test");     
    newDialog.setIcon(android.R.drawable.ic_dialog_alert);
    newDialog.setMessage("Testing testing testing... 1, 2, 3... Just press Ok.");
    newDialog.setButton(DialogInterface.BUTTON_POSITIVE, "Ok");
    newDialog.show(ft, "dialog");

    // Cause the problem. Simulate the user turning the screen
    getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

@Override
public void onClick(DialogInterface dialog, int which) {

    /*
     * hexnumber = a hex number
     * Normally equals: TestBedFragment{hexnumber #0 id=hexnumber}
     * With crash equals: TestBedFragment{hexnumber}
     */
    Log.e("TestBedFragment", "this = " + this);

    /*
     * hexnumber = a hex number
     * Normally equals: com.example.TestBed.TestBedActivity@hexnumber
     * With crash equals: null
     */
    Log.e("TestBedFragment", "getActivity() = " + getActivity()); // Will equal null... ???

    getActivity().finish();
}
}

Я не совсем уверен, в чем причина этого? Извините, если это глупый вопрос. Я читал в других местах о «утечке Windows», но я не видел никаких упоминаний об этом в logcat.

Кто-нибудь может мне помочь :) Большое спасибо

Спасибо

5
задан tang0th 10 May 2012 в 22:14
поделиться