Estoy migrando mis cuadros de diálogo, actualmente usando Activity.showDialog(DIALOG_ID);
, para usar el sistema DialogFragment
como se describe en el android reference.DialogFragmento de devolución de llamada en el cambio de orientación
Hay una pregunta que surgió durante mi desarrollo al utilizar devoluciones de llamada para ofrecer algún evento de regreso a la actividad/fragmento que abrió el diálogo:
Aquí hay un código de ejemplo de un diálogo sencillo:
public class DialogTest extends DialogFragment {
public interface DialogTestListener {
public void onDialogPositiveClick(DialogFragment dialog);
}
// Use this instance of the interface to deliver action events
static DialogTestListener mListener;
public static DialogTest newInstance(Activity activity, int titleId, int messageId) {
udateListener(activity);
DialogTest frag = new DialogTest();
Bundle args = new Bundle();
args.putInt("titleId", titleId);
args.putInt("messageId", messageId);
frag.setArguments(args);
return frag;
}
public static void udateListener(Activity activity) {
try {
// Instantiate the NoticeDialogListener so we can send events with it
mListener = (DialogTestListener) activity;
} catch (ClassCastException e) {
// The activity doesn't implement the interface, throw exception
throw new ClassCastException(activity.toString() + " must implement DialogTestListener");
}
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
int titleId = getArguments().getInt("titleId");
int messageId = getArguments().getInt("messageId");
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
// dialog title
builder.setTitle(titleId);
// dialog message
builder.setMessage(messageId);
// dialog negative button
builder.setNegativeButton("No", new OnClickListener() {
public void onClick(DialogInterface dialog, int id) {}});
// dialog positive button
builder.setPositiveButton("Yes", new OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
mListener.onDialogPositiveClick(DialogTest.this);
}});
// create the Dialog object and return it
return builder.create();
}}
Y aquí hay un código de actividad llamándolo:
public class SomeActivity extends FragmentActivity implements DialogTestListener {
private EditText mUserName;
@Override
public void onCreate(Bundle savedInstanceState) {
// setup ui
super.onCreate(savedInstanceState);
setContentView(R.layout.ui_user_edit);
// name input
mUserName = (EditText) findViewById(R.id.userEdit_editTextName);
}
@Override
public void onDialogPositiveClick(DialogFragment dialog) {
Log.d(TAG, this.toString());
mUserName.setText(mUserName.getText() + "1");
}
private void showDialog() {
DialogTest test = DialogTest.newInstance(SomeActivity.this, R.string.someTitleText, R.string.someMessageText);
test.show(getSupportFragmentManager(), "testDialog");
}}
El código es más o menos lo que ve la referencia. El problema es que una vez que haces un cambio de orientación, cuando se muestra un diálogo, deja de funcionar como se esperaba -> Debido al ciclo de vida de la actividad, ambos, la actividad y el diálogo se reconstruyen, y el diálogo ahora no tiene el correcto referencia a la nueva actividad reconstruida.
I añade el siguiente código a mis activitys método onResume:
@Override
protected void onResume() {
super.onResume();
DialogTest.udateListener(this);
}
Hacer esto, consigo el comportamiento esperado y el diálogo envía eventos de nuevo a la nueva actividad reconstruido cuando se produjo un cambio de orientación.
Mi pregunta es: ¿Cuál es el 'mejores prácticas' para manejar las devoluciones de llamada entre el DialogFragment que fue abierto por un FragmentActivity durante un cambio de orientación?
Saludos
Suena como si te hubieras caído en una trampa de muchos Fragmentos. Tuve el mismo problema que tú y pude solucionarlo mientras leía este excelente artículo: http://code.hootsuite.com/orientation-changes-on-android/. –