Ich migriere meine Dialoge, die derzeit Activity.showDialog(DIALOG_ID);
verwenden, um das DialogFragment
-System zu verwenden, wie in der android reference beschrieben.DialogFragment-Callback bei Orientierungsänderung
Es ist eine Frage, die während meiner Entwicklung entstand, als Rückrufe mit ein Ereignis zurück auf die Aktivität/Fragment zu liefern, die den Dialog geöffnet:
Hier einige Beispiel-Code eines einfachen Dialog:
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();
}}
und hier ist etwas Code Aktivität nannte es:
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");
}}
Der Code ist ziemlich viel, was Sie die Referenz. Problem ist, dass, sobald Sie eine Orientierungsänderung machen, wenn ein Dialog angezeigt wird, es nicht mehr wie erwartet funktioniert -> Aufgrund des Aktivitätslebenszyklus werden sowohl die Aktivität als auch der Dialog neu aufgebaut, und der Dialog hat nun nicht mehr die richtige Verweis auf die neu erstellte Aktivität.
Ich habe den folgenden Code in meine activitys onResume Methode:
@Override
protected void onResume() {
super.onResume();
DialogTest.udateListener(this);
}
dies tun, ich das erwartete Verhalten zu bekommen, und der Dialog sendet Ereignisse zurück an die neue rebuilt Aktivität, wenn eine Orientierungsänderung aufgetreten.
Meine Frage ist: Was ist die 'Best Practice', um die Rückrufe zwischen dem DialogFragment zu behandeln, das von einer FragmentActivity während einer Orientierungsänderung geöffnet wurde?
Mit freundlichen Grüßen
Hört sich an, als wären Sie in eine der vielen Fallstricke gefallen. Ich hatte das gleiche Problem wie Sie und ich konnte es beheben, während Sie durch diesen ausgezeichneten Artikel lesen: http://code.hootsuite.com/orientation-changes-on-android/. –