2012-12-01 59 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

相關問題