2016-12-24 46 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

对不起,我更新了! –