0

I researched on SO about communicating between fragment and fragment dialog, and I found that setTargetFragment and an interface is an approach. But I get this error when I try to setTargetFragment.

The method setTargetFragment(Fragment, int) in the type Fragment is not applicable for the arguments (SettingsDetailsFragment, int). I haven;t use fragments until now and I'm new on android. So i have this fragment:

   public class SettingsDetailsFragment extends Fragment implements
        NoticeDialogFragment.EmailChangedListner {

        public void emailUpdateFromDialog()
        {
         DialogFragment modifyEmailFragment = new ModifyEmailFragment();
        //here is where i get the error
        modifyEmailFragment.setTargetFragment(this, 0);`enter code here`

        modifyEmailFragment.show(getActivity().getFragmentManager(),
            "email");
  }
}

  // class where i have the interface
  public class NoticeDialogFragment extends DialogFragment {
    public interface EmailChangedListner {
    public void emailChanged(String text);
  }

}

 // the dialogFragment
 public class ModifyEmailFragment extends DialogFragment {

   @Override
   public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

    // Get the layout inflater
    LayoutInflater inflater = getActivity().getLayoutInflater();

    // Inflate and set the layout for the dialog
    // Pass null as the parent view because its going in the dialog layout
    final View v_iew = inflater.inflate(R.layout.email_dialog, null);

    builder.setView(v_iew)

            // Add action buttons
            .setPositiveButton(R.string.modifyBtn_settings,
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int id) {

                            EditText userEmail = (EditText) v_iew
                                    .findViewById(R.id.modifyEmail);
                            boolean validateEmail = BookMeUtils
                                    .validateEmail(userEmail.getText()
                                            .toString());

                            if (validateEmail == false) {
                                BookMeUtils.enterValidEmail(getActivity());
                            }

                            if (!(userEmail.getText().toString().length() == 0)) {

                                if (validateEmail == true) {
                                    Fragment parentFragment = getTargetFragment();
                                    ((EmailChangedListner) parentFragment)
                                            .emailChanged(userEmail
                                                    .getText().toString());
                                }
                            } else {

                            }
                        }
                    })
            .setNegativeButton(R.string.cancel_r,
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            ModifyEmailFragment.this.getDialog().cancel();
                        }
                    });

    return builder.create();
}

}

davinci.2405
  • 247
  • 1
  • 4
  • 15

2 Answers2

1

Your fragment will set listener and implement EmailChangedListner :

public class SettingsDetailsFragment extends Fragment implements
            EmailChangedListner {

            public void emailUpdateFromDialog()
            {
             DialogFragment modifyEmailFragment = new ModifyEmailFragment();        
            modifyEmailFragment.setListener(SettingsDetailsFragment.this);

            modifyEmailFragment.show(getActivity().getFragmentManager(),
                "email");
            }
       }

Dialog Fragment will have interface and an object of listener :

// the dialogFragment
 public class ModifyEmailFragment extends DialogFragment {

   EmailChangedListner listener;

   public void setListener(EmailChangedListner listener) {
        this.listener = listener;
   }

   @Override
   public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

    // Get the layout inflater
    LayoutInflater inflater = getActivity().getLayoutInflater();

    // Inflate and set the layout for the dialog
    // Pass null as the parent view because its going in the dialog layout
    final View v_iew = inflater.inflate(R.layout.email_dialog, null);

    builder.setView(v_iew)

            // Add action buttons
            .setPositiveButton(R.string.modifyBtn_settings,
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int id) {

                            EditText userEmail = (EditText) v_iew
                                    .findViewById(R.id.modifyEmail);
                            boolean validateEmail = BookMeUtils
                                    .validateEmail(userEmail.getText()
                                            .toString());

                            if (validateEmail == false) {
                                BookMeUtils.enterValidEmail(getActivity());
                            }

                            if (!(userEmail.getText().toString().length() == 0)) {

                                if (validateEmail == true) {
                                    Fragment parentFragment = getTargetFragment();
                                    listener.emailChanged(userEmail
                                                    .getText().toString());
                                }
                            } else {

                            }
                        }
                    })
            .setNegativeButton(R.string.cancel_r,
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            ModifyEmailFragment.this.getDialog().cancel();
                        }
                    });

    return builder.create();
   }


  public interface EmailChangedListner {
    public void emailChanged(String text);
  }

}
Chirag Jain
  • 1,612
  • 13
  • 20
  • ok i understand but i modified in my dialogFragment EmailChangedListner listener; public void setListener(EmailChangedListner listener) { this.listener = listener; } with SettingsDetailsFragment listener; public void setListener(SettingsDetailsFragment listener) { this.listener = listener; } and added ((EmailChangedListner) listener) .emailChanged(userEmail .getText().toString()); – davinci.2405 Oct 21 '14 at 10:42
0

Check the import for Fragment in your SettingsDetailsFragment class. Is it importing android.support.v4.app.Fragment or android.app.Fragment.

Possibility is that you are setting Fragment of android.support.v4.app as the target of DialogFragment which is of android.app.

bakriOnFire
  • 2,685
  • 1
  • 15
  • 27
  • ok I tried to modify with android.app , now I can use setTargetFragment but i have other problem in other class... I have an adapter that when i call settingsDetailsFragment now whant to return Fragment not return SettingsDetailsFragment.newInstance(position); – davinci.2405 Oct 21 '14 at 10:46
  • But i managed to solve the poblem wth the answer below But thanks for the tip i didn;t know that are problems between android.support.v4.app and android.app.fragment – davinci.2405 Oct 21 '14 at 10:47