Je migre mes boîtes de dialogue, en utilisant actuellement Activity.showDialog(DIALOG_ID);
, pour utiliser le système DialogFragment
comme indiqué dans le android reference.Rappel de DialogFragment lors du changement d'orientation
Il y a une question qui se pose au cours de mon développement lors de l'utilisation callbacks pour livrer un événement de retour à l'activité/fragment qui a ouvert la boîte de dialogue:
Voici quelques exemples de code d'un dialogue simple:
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();
}}
Et voici un code d'activité l'appelant:
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");
}}
Le code est à peu près ce que vous voyez la référence. Le problème est qu'une fois que vous changez d'orientation, lorsqu'une boîte de dialogue est affichée, elle cesse de fonctionner comme prévu -> En raison du cycle de vie de l'activité, l'activité et la boîte de dialogue sont reconstruites et le dialogue n'a plus le bon référence à la nouvelle activité reconstruite.
j'ai ajouté le code suivant à mes activitées méthode onResume:
@Override
protected void onResume() {
super.onResume();
DialogTest.udateListener(this);
}
Faire cela, je reçois le comportement attendu, et la boîte de dialogue envoie des événements de retour à la nouvelle activité Reconstruit lors d'un changement d'orientation est survenue.
Ma question est: Quelle est la «meilleure pratique» pour gérer les rappels entre le DialogFragment qui a été ouvert par un FragmentActivity lors d'un changement d'orientation?
Meilleures salutations
On dirait que vous êtes tombé d'un piège Fragment de nombreux. J'ai eu le même problème que vous et j'ai pu le résoudre en lisant cet excellent article: http://code.hootsuite.com/orientation-changes-on-android/. –