我编写了自定义 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();
}
}
}
答案 0 :(得分:2)
发生错误是因为您尝试从 DialogFragment 访问无效方法。您需要使用以下命令创建DatePickerFragment:
DatePickerFragment dFragment = new DatePickerFragment();
或者施展它:
DialogFragment dFragment = new DatePickerFragment();
((DatePickerDialog)dFragment).getFormattedDate();
但 主要缺陷 是,您尝试在getFormattedDate() method
对象完成实例化之前访问dFragment
。请记住,show()
是异步调用。
因此,当Booking_activity
已完成实例化时,您需要通知dFragment
活动。您可以使用它的接口。如下所示:
在DatePickerFragment中,添加interface:
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");
}
}
...
}
在您的Activity中实现界面并调用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 :(得分: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();
}
}
}
答案 2 :(得分:0)
您可以通过简单地转换对象来调用成员函数,如下所示
((DatePickerDialog)dFragment).getFormattedDate();
答案 3 :(得分:0)
将您的函数getFormattedDate访问模式设置为 public ,如下所示
public String getFormattedDate() {
}
将解决您的问题。
答案 4 :(得分:0)
所选解决方案运行良好,但我想指出onAttach()函数已弃用。我在这里找到了一些解决方案:Android Fragment onAttach() deprecated
我认为最受欢迎的答案是:
@Override
public void onAttach(Context context) {
super.onAttach(context);
activity = getActivity();
}
他们正在将onAtach(活动活动)更改为onAttach(上下文环境)。