2012-12-01 137 views
1

我在我的应用程序中使用日期和时间字段有一个DialogFragment1(它由MyFragmentActivity调用)。当用户点击它们时,出现DatePickerFragment和TimePickerFragment。他们还扩展DialogFragments。我想returm从中值DailogFragment1像往常一样:从DialogFragment中调用DialogFragment,getActivity中的ClassCastException()

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

,并在DialogFragment1实现EditDateDialogListener:

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:MyFragmentActivit y不能被转换为DatePickerFragment $ EditDateDialogListener

我知道这是dialogfragment不是活动,但是我怎么才能以正确的方式调用它?得到什么? 谢谢你的时间。

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

public class MyFragmentActivity extends FragmentActivity{ 
+0

是EditDateDialogListener自己的实现?我在API中看不到它。 –

+0

aha,它是由我的DialogFragment1实现的。.. – Foenix

+0

我更新了帖子。 – Foenix

回答

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

加成

我MyFragmentActivity不实现EditDateDialogListener,因为我不需要这个日期有,但在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! 

不会引发任何更多的异常。

+0

哦...你想说我​​应该先发送Date到MyFragmentActivity,然后从那里通过这个日期到FragmentDialog1? – Foenix

+0

我读了一个例子,是的,我做到了,它和Activity和DialogFragment一起工作正常。但他们在那里说:“但通常你会想要把事件传递给打开对话的活动或碎片。”因此,可以有一个“主机碎片”将数据直接传递给它,但我无法找到一条途径它直接,没有活动分销商。 – Foenix

+0

感谢您的更新,我也更新了我的帖子,所以很明显,我做了所有这些,但是使用DialogFragment,因为我不需要将日期传递给MainActivity,所以我需要它来托管DialogFragment1。 – Foenix

相关问题