在DialogFragment中调用DialogFragment,在getActivity()中调用ClassCastException

时间:2012-12-01 20:24:01

标签: java android android-dialogfragment

我的App中有一个DialogFragment1(由MyFragmentActivity调用),带有日期和时间字段。当用户单击它们时,将出现DatePickerFragment和TimePickerFragment。它们还扩展了DialogFragments。我想像往常一样从他们返回DailogFragment1的值:

public void onDateSet(DatePicker view, int year, int month, int day) {
        EditDateDialogListener activity = (EditDateDialogListener) getActivity();
        activity.onFinishDateDialog(day, month, year);

}

(在我像往常一样实施之前)

public interface EditDateDialogListener{
void onFinishDateDialog(int day, int month,int year);
}

和实现EditDateDialogListener的DialogFragment1:

public void onFinishDateDialog(int day, int month, int year){
this.mDay=day;
this.mMonth=month;
this.mYear=year;
updateDateDisplay();

} 但我有一个运行时错误     12-01 20:03:52.018:E / AndroidRuntime(756):java.lang.ClassCastException:MyFragmentActivity无法强制转换为DatePickerFragment $ EditDateDialogListener

我知道这是对话片段不是活动,但我怎样才能正确地调用它?得到什么? 谢谢你的时间。

UPD:我的MyFragmentActivity没有实现EditDateDialogListener,因为我不需要这个Date,而是在DialogFragment1中。

public class MyFragmentActivity extends FragmentActivity{

2 个答案:

答案 0 :(得分:2)

添加

  

我的MyFragmentActivity没有实现EditDateDialogListener,因为我不需要这个Date,而是在DialogFragment1中。

我明白了。然后DailogFragment1必须实现EditDateDialogListener,如下所述,您需要更改onDateSet()以使用getParentFragment()

public void onDateSet(DatePicker view, int year, int month, int day) {
    EditDateDialogListener listener = (EditDateDialogListener) getParentFragment();
    listener.onFinishDateDialog(day, month, year);
}

原始答案

我假设您正在尝试在开发人员指南中执行this example之类的操作。

此错误表示MyFragmentActivity未实现您的自定义EditDateDialogListener。只需改变一下:

public class MyFragementActivity extends FragmentActivity {

对此:

public class MyFragementActivity extends FragmentActivity implements EditDateDialogListener {
//                                             Add this:  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

覆盖听众的onFinishDateDialog()回调。


一起改变MyFragmentActivity

public class MyFragementActivity extends FragmentActivity implements EditDateDialogListener {
    @Override
    public void onFinishDateDialog(int day, int month, int year) {
        // Do something
    }
    // The rest of your MyFragmentActivity code here
}

DatePickerFragment

中更改此行以上
EditDateDialogListener activity = (EditDateDialogListener) getActivity();  // It works!

不会再抛出异常。

答案 1 :(得分:1)

我解决了这个问题。像这样: 在MyFragmentActivity中有一个标记:

DialogFragment dlg = MyFragmentActivity.newInstance(p1,p11, p2, p3);
dlg.show(getSupportFragmentManager(), "DataFragmentTag");

并在DatePickerFragment中:

public void onDateSet(DatePicker view, int year, int month, int day) {

    EditDateDialogListener handler = (EditDateDialogListener) getActivity().getSupportFragmentManager().findFragmentByTag("DataFragmentTag");
    handler.onFinishDateDialog(day, month, year);
}