4

У меня есть сценарий, где я показываю 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; 
     } 
    } 
+0

Не против создания похожих кодов? – Stan

+0

@Stan см. Отредактированный вопрос – Eliezer

+1

Я полагаю, проблема может заключаться в том, что вы используете стандартный метод show для отображения диалогов. Согласно источникам Android, этот метод не добавляет фрагмент в backstack, поэтому самый верхний диалог отклоняется, а средний отклоняется. Вы должны начать trasaction самостоятельно, прежде чем вызывать 'show' и добавить транзакцию в backstack (вызов' addToBackStack'). Пример показан на странице [Диалоговая документация по диалогу] (http://developer.android.com/reference/android/app/DialogFragment.html). – Stan

ответ

5

Я полагаю, что проблема заключается в том, что вы используете стандартный show метод для отображения диалоговых окон. Согласно источникам Android, этот метод не добавляет фрагмент в backstack, поэтому самый верхний диалог отклоняется, а средний отклоняется.

Перед тем, как позвонить , необходимо начать транзакцию и добавить транзакцию к стопке (звонок addToBackStack). Пример показан на DialogFragment documentation page.