2016-12-24 40 views
0

延長DialogFragment我已經定製書面DatePickerDialog延伸DialogFragment並實現DatePickerDialog.OnDateSetListener類的成員函數。如何調用有一個活動

public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener { 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
    DatePickerDialog dpd = new DatePickerDialog(getActivity(), 
       R.style.MyDialogTheme, this, year, month, day); 
    return dpd; 
    } 

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

    } 

    // own methods 
    String getFormattedDate() { 
    } 
} 

我在MainActivity中調用了這個片段。

public class Booking_activity extends AppCompatActivity implements View.OnClickListener { 

    public void onClick(View view) { 
    if (view == imgView_from) { 
     // Initialize a new date picker dialog fragment 
     DialogFragment dFragment = new DatePickerFragment(); 
     // Show the date picker dialog fragment 
     dFragment.show(getFragmentManager(), "Date Picker"); 

     // error 
     dFragment.getFormattedDate(); 
    } 
    } 
} 

回答

2

發生此錯誤是因爲您嘗試從DialogFragment訪問無效方法。您需要與創建DatePickerFragment:

DatePickerFragment dFragment = new DatePickerFragment(); 

或鑄造它:

DialogFragment dFragment = new DatePickerFragment(); 
((DatePickerDialog)dFragment).getFormattedDate(); 

的重大缺陷是,您嘗試訪問getFormattedDate() methoddFragment對象已完成實例化。請記住,show()是一個異步調用。

因此,當dFragment已完成實例化時,您需要通知Booking_activity活動。你可以使用它的接口。像下面這樣:

  1. 在你DatePickerFragment,添加接口:

    public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener { 
    
        private DatePickerListener mListener; 
    
        public interface DatePickerListener { 
        void onDialogFinishInitialized(); 
        } 
    
        @Override 
        public Dialog onCreateDialog(Bundle savedInstanceState) { 
        DatePickerDialog dpd = new DatePickerDialog(getActivity(), 
          R.style.MyDialogTheme, this, year, month, day); 
    
        // you need to inform the activity when Dialog has finish 
        // initialized. 
        mListener.onDialogFinishInitialized(); 
    
        return dpd; 
        } 
    
        ... 
    
        // Need to add the activity as the listener. 
        @Override 
        public void onAttach(Activity activity) { 
        super.onAttach(activity); 
        // This makes sure that the container activity has implemented 
        // the listener interface. If not, it throws an exception 
        try { 
         mListener = (DatePickerListener) activity; 
        } catch (ClassCastException e) { 
         throw new ClassCastException(activity.toString() + " must implement DatePickerListener"); 
        } 
        } 
    
        ... 
    
    } 
    
  2. 實現您的活動界面,並調用getFormattedDate()方法:

    public class Booking_activity extends AppCompatActivity 
    implements View.OnClickListener, DatePickerFragment.DatePickerListener { 
        ... 
        private DatePickerFragment dFragment; 
        ... 
        @Override 
        public void onDialogFinishInitialized() { 
        // You can call the method here now 
        dFragment.getFormattedDate(); 
        } 
        ... 
    } 
    
1

需要初始化一個新的日期選擇器對話框片段:在下面的代碼

DatePickerFragment dFragment = new DatePickerFragment(); 

像:

public class Booking_activity extends AppCompatActivity implements View.OnClickListener { 
    public void onClick(View view) { 
    if (view == imgView_from) { 

     // Initialize a new date picker dialog fragment 
     DatePickerFragment dFragment = new DatePickerFragment(); // Changed this 

     // Show the date picker dialog fragment 
     dFragment.show(getFragmentManager(), "Date Picker"); 

     // error 
     dFragment.getFormattedDate(); 
    } 
    } 
} 
0

,你可以通過簡單的鑄造對象調用成員函數如下所示

((DatePickerDialog)dFragment).getFormattedDate(); 
0

讓你的函數getFormattedDate訪問模式公共像下面

public String getFormattedDate() { 
     } 

將解決你的問題。

0

的選定的解決方案效果很好,但我想指出onAttach()函數已棄用。我找到了一些解決方案,在這裏:Android Fragment onAttach() deprecated

我認爲最普遍的回答是這樣的:

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
    activity = getActivity(); 
} 

他們正在改變onAttach(活動活動),以onAttach(上下文的背景下)。

+0

雖然此鏈接可能會回答問題,但最好在此處包含答案的基本部分,並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 - [來自評論](/ review/low-quality-posts/16739288) – litelite

+0

對不起,我更新了! –