Search code examples
androidfunctioncalldialogfragment

Android: Call function of Activity out of DialogFragment


I have a problem to call a function of my Activity out of DialogFragment. There are public functions in my MainActivity which I need to call for some calculations that are done in the DialogFragment. Everytime I try to call a function with getActivity(). there occurs the problem "Cannot resolve method".

Here is how I call the DialogFragment in the MainActivity:

FragmentManager fm = getSupportFragmentManager();
        DialogWeekly dialogWeekly = new DialogWeekly();
        dialogWeekly.show(getFragmentManager(), "fragment_dialogWeekly");

And this is how the DialogFragment looks like. I have added two comment lines where the mentioned problem occurs:

public class DialogReminder extends DialogFragment implements AdapterView.OnItemSelectedListener {

//--- Static Variables -----------------------------------------------------------------------//
private static final String MY_PREFS = "my_preferences";
private static Activity activity;
private static TimePicker timePicker;
private static View dialogReminderView;

//--- Integer Variables ----------------------------------------------------------------------//
private Integer weekday;

//--- String Variables -----------------------------------------------------------------------//
private String weekdayString;

//--- Other Variables ------------------------------------------------------------------------//
private SharedPreferences sharedPreferences;


/**
 * Empty constructor required for DialogFragment
 */
public DialogReminder() { }

/**
 * Called when a fragment is first attached to its activity.
 * onCreate(Bundle) will be called after this
 * @param activity Activity that is attached to this fragment
 */
public void onAttach(Activity activity) {
    super.onAttach(activity);
}

//--- Override Functions ---------------------------------------------------------------------//
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    return inflater.inflate(R.layout.dialog_weekly, container);
}

@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    sharedPreferences = getActivity().getSharedPreferences(MY_PREFS, Context.MODE_PRIVATE);

    return createAlertDialog();
}

@Override
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
    Integer selectedItem = parent.getSelectedItemPosition();
    weekdayString = parent.getItemAtPosition(pos).toString();
    // Here is the problem: savePreferences -> cannot resolve method
    getActivity().savePreferences("spinnerSelectionWeekday", String.valueOf(selectedItem));

    weekday = selectedItem + 2;
    if (weekday == 8) {
        weekday = 1;
    }
}

@Override
public void onNothingSelected(AdapterView<?> parent) {
    // Another interface callback
}

//--- General Activity Functions -------------------------------------------------------------//

/**
 *
 * @return
 */
private AlertDialog createAlertDialog() {
    AlertDialog.Builder alert = new AlertDialog.Builder(getActivity());
    alert.setTitle(getResources().getString(R.string.optionReminder));
    alert.setView(dialogReminderView);

    alert.setNegativeButton(getResources().getString(R.string.cancel), new DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.cancel();
        }
    });

    alert.setPositiveButton(getResources().getString(R.string.ok), new DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {
            setReminder();
            dialog.cancel();
        }
    });

    setElementsGUI();

    return alert.create();
}

/**
 *
 */
private void setElementsGUI() {
    Spinner spinner = (Spinner) dialogReminderView.findViewById(R.id.reminderWeekdaySpinner);
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(),
            R.array.reminderSpinnerArray, android.R.layout.simple_spinner_item);
    // Specify the layout to use when the list of choices appears
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner.setOnItemSelectedListener(this);
    spinner.setAdapter(adapter);
    spinner.setSelection(Integer.parseInt(sharedPreferences.getString("spinnerSelectionWeekday", "0")));
}

//--- Button Functions -----------------------------------------------------------------------//

/**
 *
 */
private void setReminder() {
    // Here is the problem: all functions with getActivity() -> cannot resolve method
    getActivity().checkReminder();
    getActivity().setWeekdayReminder(weekday);
    getActivity(("hour", String.valueOf(timePicker.getCurrentHour()));
    getActivity().savePreferences("minute", String.valueOf(timePicker.getCurrentMinute()));

    getActivity().checkReminder();

    String hour = String.valueOf(getActivity().getHour());
    if (hour.length() < 2) {
        hour = "0" + hour;
    }
    String minute = String.valueOf(getActivity().getMinute());
    if (minute.length() < 2) {
        minute = "0" + minute;
    }
    String time = hour + ":" + minute;

    String message = getResources().getString(R.string.reminderToast, weekdayString, time);
    Toast toast = Toast.makeText(getActivity().getApplicationContext(), message, Toast.LENGTH_LONG);
    toast.show();
}

}


Solution

  • While getActivity() returns a MainActivity at runtime, the compiler has to assume that it's just an Activity object and that those methods don't exist (since an Activity has none of these methods). Hence the compiler error.

    What you need to do is cast the Activity to a MainActivity object like so:

    ((MainActivity)getActivity()).savePreferences(...