Communicate between fragment and fragment dialog

僤鯓⒐⒋嵵緔 提交于 2020-01-06 08:51:49

问题


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();
}

}


回答1:


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.




回答2:


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);
  }

}


来源:https://stackoverflow.com/questions/26483781/communicate-between-fragment-and-fragment-dialog

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!