У меня есть сценарий, где я показываю DialogFragment
(используя getSupportFragmentManager()
), который показывает список значений и кнопку «Добавить». Если пользователь нажимает кнопку добавления, я показываю еще один DialogFragment
(используя getChildFragmentManager()
, который состоит из EditText
и Button
. Когда пользователь нажимает новый Button
, если значение проходит проверку, я добавляю его в список. Если он не прошел проверку , Я показываю еще один DialogFragment
, который отображает сообщение об ошибке и кнопку «ОК». Мне бы хотелось, чтобы при нажатии кнопки «ОК» пользователь по-прежнему будет видеть DialogFragment
с EditText
и Button
, чтобы они могли просматривать плохое значение и, возможно, изменить его. Однако, когда в сообщении об ошибке DialogFragment
нажата кнопка «ОК», диалог отклоняется и отображается только оригинал DialogFragment
(тот, который содержит список значений).Android Multiple Nested DialogFragment
Как бы сохранить второй DialogFragment
, который все еще отображается после того, как третий уволен?
EDIT: Вот некоторые фрагменты кода:
//clicking this button shows the first ("outer") fragment
findViewById(R.id.voicemail_notifications_email_addresses).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
AddressListDialog.newInstance(
line, AddressListDialog.VOICEMAIL_NOTIFICATIONS_EMAIL)
.show(((FragmentActivity)getContext()).getSupportFragmentManager(), "dialog");
}
});
public static class AddressListDialog extends DialogFragment {
public AddressListDialog() {}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final View v = LayoutInflater.from(getActivity()).inflate(R.layout.vm_address_list_dialog, null);
ListView lv = (ListView) v.findViewById(R.id.voicemail_notifications_address_list);
final AddressAdapter adapter = new AddressAdapter();
lv.setAdapter(adapter);
v.findViewById(R.id.voicemail_add_address_button).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//first child fragment
AddAddressDialog.newInstance(getType()).setAdapter(adapter)
.show(getChildFragmentManager(), "dialog");
}
});
Dialog d = new AlertDialog.Builder(getActivity())
.setTitle(titleRes)
.setView(v)
.setPositiveButton(R.string.global_dialog_pos, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
dialog.dismiss();
}
}
)
.create();
return d;
}
private class AddressAdapter extends BaseAdapter {
.
.
.
public boolean add(LineVoicemailInfo.VmContact contact) {
if(addresses.size() >= 3) {
return false;
}
else if(!contact.isValid(isEmailType())) {
return true;
}
else {
addresses.add(contact);
notifyDataSetChanged();
return true;
}
}
public static class AddAddressDialog extends DialogFragment {
private AddressAdapter adapter;
public AddAddressDialog() {}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
DialogInterface.OnClickListener onPosClick = null;
final View v;
v = LayoutInflater.from(getActivity()).inflate(R.layout.voicemail_add_email_address, null);
onPosClick = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
LineVoicemailInfo.VmContact contact = new LineVoicemailInfo.VmContact(((EditText)v.findViewById(R.id.voicemail_add_email_address)).getText().toString());
if(!adapter.add(contact)) {
//second child fragment
BadAddressDialog.newInstance("Not a valid address")
.show(getChildFragmentManager(), "dialog");
}
}
};
Dialog d = new AlertDialog.Builder(getActivity())
.setTitle("Add Address")
.setView(v)
.setCancelable(false)
.setPositiveButton(R.string.voicemail_addresses_add, onPosClick)
.setNegativeButton(R.string.global_dialog_neg, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
dialog.dismiss();
}
})
.create();
setCancelable(false);
return d;
}
}
public static class BadAddressDialog extends DialogFragment {
public BadAddressDialog() {}
public static BadAddressDialog newInstance(String message) {
BadAddressDialog frag = new BadAddressDialog();
Bundle args = new Bundle();
args.putString("message", message);
frag.setArguments(args);
return frag;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
String message = getArguments().getString("message");
Dialog d = new AlertDialog.Builder(getActivity())
.setTitle("Error adding address")
.setMessage(message)
.setCancelable(false)
.setPositiveButton(R.string.global_dialog_pos, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
dialog.dismiss();
}
})
.create();
setCancelable(false);
return d;
}
}
Не против создания похожих кодов? – Stan
@Stan см. Отредактированный вопрос – Eliezer
Я полагаю, проблема может заключаться в том, что вы используете стандартный метод show для отображения диалогов. Согласно источникам Android, этот метод не добавляет фрагмент в backstack, поэтому самый верхний диалог отклоняется, а средний отклоняется. Вы должны начать trasaction самостоятельно, прежде чем вызывать 'show' и добавить транзакцию в backstack (вызов' addToBackStack'). Пример показан на странице [Диалоговая документация по диалогу] (http://developer.android.com/reference/android/app/DialogFragment.html). – Stan