Я создал фрагмент диалога текстового запроса для повторного использования. Но это не обрабатывать конфиг. изменения. После восстановления фрагмента mClickListener имеет значение null (как и ожидалось). Вопрос - как я могу сохранить обратный вызов?
(Я новичок в Java и не знаю общих шаблонов / решений Java)
public class TextQueryDialogFragment extends DialogFragment {
private OnDialogListener mClickListener;
private EditText mTextWidget;
public void setClickListener(OnDialogListener listener) {
mClickListener = listener;
}
public String getQueryText() {
return mTextWidget.getText().toString();
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
LayoutInflater factory = LayoutInflater.from(getActivity());
final View queryView = factory.inflate(R.layout.query_dialog_text, null);
mTextWidget = (EditText) queryView.findViewById(R.id.query_dialog_text);
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
.setView(queryView)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
if(null != mClickListener)
mClickListener.OnPositiveClick();
dialog.dismiss();
}
})
.setNegativeButton(android.R.string.cancel,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
if(null != mClickListener)
mClickListener.OnNegativeClick();
dialog.cancel();
}
});
return builder.create();
}
}
Использование:
TextQueryDialogFragment dialog = new TextQueryDialogFragment();
dialog.setQueryText(mBookmarkTitle);
dialog.setClickListener(new OnDialogListener() {
@Override
public void OnPositiveClick() {
String title = dialog.getQueryText();
//do work here
}
@Override
public void OnNegativeClick() {}
});
dialog.show(getFragmentManager(), "MYTAG");
Serializable не будет работать, и, следовательно, onSaveInstanceState - это не то, что мне нужно. Parcelable может сделать (с помощью aidl и IBinder), но это слишком много для такой простой задачи.
Пока я нашел два более или менее подходящих решения:
- Хранить обратные вызовы в приложении и извлекать их по идентификатору / тегу взяты отсюда
обновление обратных вызовов при создании родительского фрагмента:
TextQueryDialogFragment dialog = (TextQueryDialogFragment)
. GetFragmentManager () findFragmentByTag (RENAME_TAG);
if (null! = dialog) {
dialog.setClickListener (getListener ());
}
Есть ли лучшие решения или эти два в порядке?