Luiz Alves
Luiz Alves

Reputation: 2645

Android Exception calling DialogFragment from Fragment

I have created a dialogfragment I´d like to call it from a Fragment.

I am getting an exception about MainActivity should implement the Listener.

But I implemented it into Fragment. What is wrong?

    E/AndroidRuntime: FATAL EXCEPTION: main
                      Process: net.techabout.appointment, PID: 4162
                      java.lang.ClassCastException: net.techabout.appointment.MainActivity@3a11f41 deve implementar MyDialogFragmentListener
                          at net.techabout.appointment.AndroidDialogFragment.onAttach(AndroidDialogFragment.java:53)
                          at 

android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1043)
                          at android.support.v4.app.BackStackRecord.setLastIn(BackStackRecord.java:838)

/////My Fragment

public class HorariosMedFragment extends Fragment  implements
            AndroidDialogFragment.MyDialogFragmentListener {

    ...........
    ......
        void OpenDialog(String title, String msg, String but_sim, String but_nao) {
            AndroidDialogFragment myDialogFragment = AndroidDialogFragment
                    .newInstance(title, msg, but_sim, but_nao);
            myDialogFragment.show(getFragmentManager(), "myDialogFragment");
        }
        @Override
        public void onDialogPositiveClick(DialogFragment dialog) {
            //do something
        @Override
        public void onDialogNegativeClick(DialogFragment dialog) {
            dialog.dismiss();
        }

    }

//MyDialogFragment

public class AndroidDialogFragment extends DialogFragment {

        public interface MyDialogFragmentListener {
            public void onDialogPositiveClick(DialogFragment dialog);
            public void onDialogNegativeClick(DialogFragment dialog);
        }

        // Usa essa instância da interface para entregar eventos de ação
        MyDialogFragmentListener mListener;

        static AndroidDialogFragment newInstance(String titulo, String msg,String but_sim, String but_nao) {
            AndroidDialogFragment dialog = new AndroidDialogFragment();
            Bundle args = new Bundle();
            args.putString("title", titulo);
            args.putString("but_sim", but_sim);
            args.putString("but_nao", but_nao);
            args.putString("msg", msg);

            dialog.setArguments(args);
            return dialog;
        }


        @Override
        public void onAttach(Context context) {
            super.onAttach(context);
            // Verifica se a activity implementa a interface de callbacks
            try {
                // Instancia o MyDialogFragmentListener para que possamos enviar
                // eventos para o host
                mListener = (MyDialogFragmentListener) context;
            } catch (ClassCastException e) {
                // Essa activity não implementa a interface, levanta exceção
                throw new ClassCastException(context.toString()
                        + " deve implementar MyDialogFragmentListener");
            }
        }

        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            String title = getArguments().getString("title");
            String but_sim = getArguments().getString("but_sim");
            String but_nao = getArguments().getString("but_nao");
            String msg = getArguments().getString("msg");
            Dialog myDialog = new AlertDialog.Builder(getActivity())
                    .setIcon(R.drawable.ic_launcher)
                    .setTitle(title)
                    .setMessage(msg)
                    .setPositiveButton("OK", new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            // Dispara o evento onDialogPositiveClick para a
                            // activity que estiver escultando
                            mListener.onDialogPositiveClick(
                                    AndroidDialogFragment.this);
                        }
                    })
                    .setNegativeButton("Cancelar",
                            new DialogInterface.OnClickListener() {

                                @Override
                                public void onClick(DialogInterface dialog,
                                                    int which) {
                                    // Dispara o evento onDialogNegativeClick para a
                                    // activity que estiver escultando
                                    mListener.onDialogNegativeClick(
                                            AndroidDialogFragment.this);
                                }
                            }).create();

            return myDialog;
        }

    }

Upvotes: 0

Views: 519

Answers (2)

fluffyBatman
fluffyBatman

Reputation: 6704

In onAttach, you're doing this mListener = (MyDialogFragmentListener) context which basically tries to cast the context of the Activity to a MyDialogFragmentListener. See, you implemented the interface on HorariosMedFragment. But the context of this HorariosMedFragment actually belongs to Activity class(MainActivity) where the HorariosMedFragment lunched from. Since MainActivity class didn't implement the listener hence it can't cast the context to mListener.

Upvotes: 0

Sanjeet
Sanjeet

Reputation: 2403

While creating Dialog Fragment instance set target fragment like

myDialogFragment.setTargetFragment(HorariosMedFragment.this,0);

After that in DialogFragment's onCreate method get that targeted fragment

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    try {
         mListener = (MyDialogFragmentListener) getTargetFragment();

    } catch (ClassCastException e) {
        throw new ClassCastException("Calling Fragment must implement MyDialogFragmentListener");
    }
}

Upvotes: 3

Related Questions