'How to call a DialogFragment from a Fragment

Very simple, I try to call a multiple choice DialogFragment that I made, which works in any activity, but not in a fragment, hopefully you can help me!

Here is the error message:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.poop123, PID: 32758
    java.lang.ClassCastException: com.example.poop123.MainActivity@3c490cdGenderChoiceDialog must be implemented!
        at com.example.poop123.GenderChoiceDialog.onAttach(GenderChoiceDialog.java:30)
        at androidx.fragment.app.Fragment.performAttach(Fragment.java:2922)
        at androidx.fragment.app.FragmentStateManager.attach(FragmentStateManager.java:464)
        at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:275)
        at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2189)
        at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2100)
        at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:2002)
        at androidx.fragment.app.FragmentManager$5.run(FragmentManager.java:524)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:224)
        at android.app.ActivityThread.main(ActivityThread.java:7562)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)

GenderChoiceDialog.java

package com.example.poop123;

import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.DialogFragment;

public class GenderChoiceDialog extends DialogFragment {

    int position = 0;

    public interface GenderChoiceListener {
        void onPositiveButtonClicked(String [] list, int position);
        void onNegativeButtonClicked();
    }

    GenderChoiceListener mListener;

    @Override
    public void onAttach (Context context) {
        super.onAttach((context));
        try {
            mListener = (GenderChoiceListener) context;
        } catch (Exception e) {
            throw new ClassCastException(getActivity().toString()+"GenderChoiceDialog must be implemented!");
        }
    }

    @NonNull
    @Override
    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

        final String [] list = this.getResources().getStringArray(R.array.genders);

        builder.setTitle("Gender").setSingleChoiceItems(list, position, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int i) {
                position = i;
            }

        })
                .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int i) {
                        mListener.onPositiveButtonClicked(list, position);
                    }
                })

                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int i) {
                        mListener.onNegativeButtonClicked();
                    }
                });

        return builder.create();
    }
}

home_fragment.java

package com.example.poop123;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.Fragment;

import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import org.w3c.dom.Text;


public class home_fragment extends Fragment implements GenderChoiceDialog.GenderChoiceListener {

    TextView genderSelector;
    TextView activitySelector;
    TextView goalSelector;
    TextView metabolicRate;
    EditText eHeight; String height; String tempHeight;
    EditText eWeight; String weight; String tempWeight;
    EditText eAge; String age; String tempAge;


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_home_fragment, container, false);

        activitySelector = (TextView) view.findViewById(R.id.tvActivitySelector);
        genderSelector = (TextView) view.findViewById(R.id.tvGenderSelector);
        goalSelector = (TextView) view.findViewById(R.id.tvGoalSelector);
        metabolicRate = (TextView) view.findViewById(R.id.tvBasalMetabolicRateCalculator);

        eHeight = (EditText) view.findViewById(R.id.etHeight);
        eWeight = (EditText) view.findViewById(R.id.etWeight);
        eAge = (EditText) view.findViewById(R.id.etAge);

        height = eHeight.getText().toString();
        weight = eWeight.getText().toString();
        age = eAge.getText().toString();

        eHeight.addTextChangedListener(updater);
        eWeight.addTextChangedListener(updater);
        eAge.addTextChangedListener(updater);

        genderSelector.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                DialogFragment gcd = new GenderChoiceDialog();
                gcd.setCancelable(false);
                gcd.show(getParentFragmentManager(), "Single Choice Dialog");
            }
        });

        activitySelector.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(getActivity(), ActivityLevel.class);
                startActivity(i);
            }
        });

        goalSelector.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(getActivity(), Goal.class);
                startActivity(i);
            }
        });

        return view;
    }

    private TextWatcher updater = new TextWatcher() {
        @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if (eWeight.getText().toString().isEmpty() || eHeight.getText().toString().isEmpty() || eAge.getText().toString().isEmpty()) {

            } else {
                displayMetabolicRate();
            }
        }@Override public void afterTextChanged(Editable s) { }
    };

    private void displayMetabolicRate() {

        if (!eHeight.getText().toString().isEmpty() && !eWeight.getText().toString().isEmpty() && !eAge.getText().toString().isEmpty()) {
            double h = Double.parseDouble(eHeight.getText().toString());
            double w = Double.parseDouble(eWeight.getText().toString());
            double a = Double.parseDouble(eAge.getText().toString());

            metabolicRate.setText(Double.toString(calculate(h, w, a, genderSelector)));

        }

    }

    private double calculate(double h, double w, double a, TextView g) {
        if (g.getText().toString().equals("Male")) {
            return 5 + (10 * w) + (6.25 * h) - (5 * a);
        } else {
            return -161 + (10 * w) + (6.25 * h) - (5 * a);
        }
    }

    @Override
    public void onPositiveButtonClicked(String[] list, int position) {
        genderSelector.setText(list[position]);
    }

    @Override
    public void onNegativeButtonClicked() {

    }
}

sdgsfdgdsgdhfbrdtrdtghfmhdszrfsvfgchfgxdrfchsrdxgchvchfdhbsdgdxtgzrdsxgr<sdxhfrdsxg (ignore this)



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source