Sto migrando i miei dialoghi, attualmente utilizzando Activity.showDialog(DIALOG_ID);
, per utilizzare il sistema DialogFragment
come discusso nello android reference.Richiamata DialogFragment sul cambio di orientamento
C'è una domanda che nasce durante il mio sviluppo quando si utilizza callback per fornire qualche evento torna all'attività/frammento che ha aperto la finestra di dialogo:
ecco qualche codice di esempio di una semplice finestra di dialogo:
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();
}}
ed ecco qualche codice attività definendolo:
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");
}}
il codice è più o meno quello che si vede il riferimento. Il problema è che, una volta apportata una modifica dell'orientamento, quando viene visualizzata una finestra di dialogo, smette di funzionare come previsto -> A causa del ciclo di vita dell'attività, entrambe le attività e la finestra di dialogo vengono ricostruite e la finestra di dialogo non dispone della corretta riferimento alla nuova attività ricostruita.
ho aggiunto il seguente codice ai miei activitys metodo onResume:
@Override
protected void onResume() {
super.onResume();
DialogTest.udateListener(this);
}
Facendo questo, ho il comportamento previsto, e la finestra di dialogo invia gli eventi di nuovo alla nuova attività ricostruito quando un cambiamento di orientamento si è verificato.
La mia domanda è: Qual è la "migliore pratica" per gestire i callback tra il DialogFragment che è stato aperto da FragmentActivity durante un cambio di orientamento?
migliori saluti
Sembra che tu sia caduto in una delle tante trappole del Frammento. Ho avuto lo stesso problema di te e sono riuscito a risolverlo leggendo questo eccellente articolo: http://code.hootsuite.com/orientation-changes-on-android/. –