我向MainActivity添加了一个带有日期选择器的对话框片段,并且工作正常。我现在想将用日期选择器选择的日期传递给MainActivity调用的新活动。因此,我使用一种意图在MainActivity和新活动之间进行通信。
但是,实际上如何将从对话框片段中选择的日期传递给MainActivity?
public class DatePickerFragment extends DialogFragment
implements DatePickerDialog.OnDateSetListener {
public static String formattedDate = "com.example.myfirstapp.DATEOB";
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Use the current date as the default date in the picker
final Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
// Create a new instance of DatePickerDialog and return it
return new DatePickerDialog(getActivity(), this, year, month, day);
}
@Override
public void onDateSet(DatePicker view, int year, int month, int day) {
Calendar c = Calendar.getInstance();
c.set(year, month, day);
在aFragment
和an之间传递数据的最佳实践解决方案Activity
是使用侦听器模式。
首先,我们需要定义一个接口。我们添加了一个onDateSet()
带有Date
参数的方法。它将用于传递Date
回Activity
:
public interface DatePickerFragmentListener {
public void onDateSet(Date date);
}
我建议您将此接口嵌套在这样的内部DatePickerFragment
:
public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {
public interface DatePickerFragmentListener {
public void onDateSet(Date date);
}
...
}
我们需要在中添加一个成员变量,DatePickerFragment
以保存对侦听器的引用。我们还需要用于侦听器的getter和setter方法,以及用于安全调用侦听器的notify方法:
public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {
private DatePickerFragmentListener datePickerListener;
public interface DatePickerFragmentListener {
public void onDateSet(Date date);
}
public DatePickerFragmentListener getDatePickerListener() {
return this.datePickerListener;
}
public void setDatePickerListener(DatePickerFragmentListener listener) {
this.datePickerListener = listener;
}
protected void notifyDatePickerListener(Date date) {
if(this.datePickerListener != null) {
this.datePickerListener.onDateSet(date);
}
}
...
}
最佳实践是使用静态工厂方法创建新Fragment
实例。除了方便之外,执行此操作的许多好处之一是,您可以定义一种Fragment
正确设置方法(例如,设置侦听器,将值传递给Fragment
等等),并且您不必担心以后会遗忘或混淆某些内容。在我们的情况下,需要设置DatePickerFragmentListener
:
public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {
public static DatePickerFragment newInstance(DatePickerFragmentListener listener) {
DatePickerFragment fragment = new DatePickerFragment();
fragment.setDatePickerListener(listener);
return fragment;
}
...
}
现在仍然失踪的唯一的事情是,我们需要调用notifyDatePickerListener()
中的回调DatePicker
中DatePickerFragment
:
@Override
public void onDateSet(DatePicker view, int year, int month, int day) {
Calendar c = Calendar.getInstance();
c.set(year, month, day);
Date date = c.getTime();
// Here we call the listener and pass the date back to it.
notifyDatePickerListener(date);
}
在您中,Activity
我们只需要调用newInstance()
添加的方法即可创建正确的新设置DatePickerFragment
。我们还需要通过DatePickerFragmentListener
进入newInstance()
。我建议您让您Activity
实现该DatePickerFragmentListener
接口:
public class MainActivity extends Activity implements DatePickerFragmentListener {
...
@Override
public void onDateSet(Date date) {
// This method will be called with the date from the `DatePicker`.
}
}
您只需要DatePickerFragment
使用newInstance()
方法创建一个新实例并传递Activity
即可完成此工作:
DatePickerFragment fragment = DatePickerFragment.newInstance(this);
就是这样!以这种方式实现它可能会多出10行代码,但这是100倍更好的解决方案。
我测试了所有内容,一切正常。希望我能为您提供帮助,如果您还有其他问题,欢迎随时提出!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句