其他分享
首页 > 其他分享> > Android:从DialogFragment调用Activity的功能

Android:从DialogFragment调用Activity的功能

作者:互联网

我在从DialogFragment调用我的Activity函数时遇到问题.我的MainActivity中有一些公共函数,我需要调用这些函数才能在DialogFragment中完成一些计算.每次我尝试使用getActivity()调用函数时.出现问题“无法解决方法”.

这是我在MainActivity中调用DialogFragment的方式:

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

这就是DialogFragment的样子.我在出现上述问题的地方添加了两个注释行:

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

}

解决方法:

尽管getActivity()在运行时返回MainActivity,但是编译器必须假定它只是一个Activity对象,并且这些方法不存在(因为Activity没有这些方法).因此,编译器错误.

您需要做的是将Activity转换为MainActivity对象,如下所示:

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

标签:dialogfragment,call,android,function
来源: https://codeday.me/bug/20191029/1957822.html