Actualmente tengo algunos problemas con DialogFragments. Estoy usando los últimos paquetes de soporte v.4 (Revisión 8, creo) Mi problema es que si la orientación de mi teléfono cambia mientras el cuadro de diálogo está abierto, la aplicación comienza a actuar de manera extraña.DialogFragment Orientation Change Crash with getActivity()
Actualmente mi aplicación funciona así: Hay una FragmentActivity, llama a un Fragment. este fragmento a continuación, llama a un DialogFragment (a través de getActivity(). GetSupportFragmentManager().
Si los cambios de orientación, mientras que el diálogo está abierto, el getActivity() en el fragmento = null. Esto causa un problema si quiero termina la actividad etc.
para causar este se abre el cuadro de diálogo, cambie la orientación y presione un botón Sólo después de pulsar el botón se bloquea
Mi DialogFragment se llama 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();
}
}
Este es el fragmento:
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: [email protected]
* With crash equals: null
*/
Log.e("TestBedFragment", "getActivity() = " + getActivity()); // Will equal null... ???
getActivity().finish();
}
}
No estoy muy seguro de cuál es la causa? Lo siento si es una pregunta estúpida. He leído en otros lugares sobre 'Windows Leaking', pero no he visto ninguna mención de eso en Logcat.
¿Puede alguien ayudarme :) Sus muy apreciados
Gracias