首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android:从DialogFragment调用活动功能

Android:从DialogFragment调用活动功能
EN

Stack Overflow用户
提问于 2014-09-13 01:20:16
回答 2查看 4.9K关注 0票数 3

我很难从DialogFragment中调用我的活动函数。在我的MainActivity中有一些公共函数,我需要调用一些在DialogFragment中完成的计算。每次我尝试用getActivity()调用函数时。出现“无法解决方法”的问题。

下面是如何在DialogFragment中调用MainActivity:

代码语言:javascript
运行
复制
FragmentManager fm = getSupportFragmentManager();
        DialogWeekly dialogWeekly = new DialogWeekly();
        dialogWeekly.show(getFragmentManager(), "fragment_dialogWeekly");

这就是DialogFragment的样子。我增加了两行评论,上面提到的问题发生了:

代码语言:javascript
运行
复制
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();
}

}

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-13 01:28:05

当getActivity()在运行时返回一个MainActivity时,编译器必须假设它只是一个Activity,并且这些方法并不存在(因为一个活动没有这些方法)。因此产生了编译器错误。

您需要做的是将活动强制转换为如下所示的MainActivity对象:

代码语言:javascript
运行
复制
((MainActivity)getActivity()).savePreferences(...
票数 7
EN

Stack Overflow用户

发布于 2018-11-13 10:00:32

在kotlin中,我们可以将片段强制转换为如下所示的MainActivity对象

(活动为MainActivity).yourMethodeName()

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25818932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档