'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 |
|---|
