六、对话框的使用 和 fragment之间的数据传递
6.1 DialogFragment
(1)创建 fragment 文件,继承 DialogFragment 类,可命名为:DatePickerFragment.java(注意命名规则)。
(2)重写 onCreateDialog 方法,使用 AlertDialog.Builder 类的构造方法返回一个 AlertDialog.Builder 的实例。
(3) 通过调用 AlertDialog.Builder 的 setTitle 和 setPositiveButton 方法来分别设置对话框的标题和点击确认按钮的触发事件,最后通过调用 create 方法来返回创建完成的 AlertDialog 实例。
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
Dialog dialog = new AlertDialog.Builder(getActivity()).setView(mDatePicker).setTitle(R.string.article_title_picker).setPositiveButton(android.R.string.ok, null).create();
return dialog;
}
(4)当要显示该对话框时,应先实例化该 DatePickerFragment 实例,并创建一个 FragmentManager 实例,然后调用 DialogFragment.show() 方法,其第一个参数为刚刚实例化的 FragmentManager 实例,第二个参数为标签 。
FragmentManager fragmentManager = getFragmentManager();
DatePickerFragment fragment = DatePickerFragment.newInstance(mArticle.getDate());
fragment.show(fragmentManager, DIALOG_DATE);
6.2 对话框内容的设置
(1)创建布局文件,若时创建时间选择对话框则根元素应为 DatePicker ,文件可命名为:dialog_date.xml(注意命名规范)。
(2)在 DatePickerFragment 类中设置 DatePicker 属性,并在 onCreateDialog 方法中 LayoutInflater.from().inflate() 方法创建视图,通过 AlertDialog.Builder 的 setView 方法将绑定到对话框。
View view = LayoutInflater.from(getActivity()).inflate(R.layout.dialog_date, null);
6.3 fragment 间的数据传递
(1)直接使用 fragment argument 即可。
传出信息:
public static DatePickerFragment newInstance(Date date) {
Bundle bundle = new Bundle();
bundle.putSerializable(EXTRA_DATE, date);
DatePickerFragment datePickerFragment = new DatePickerFragment();
datePickerFragment.setArguments(bundle);
return datePickerFragment;
}
接受信息:
Date date = (Date) getArguments().getSerializable(EXTRA_DATE);
(2)使用 setTargetFragment 方法来绑定两个 fragment ,该方法有两个参数,目标 fragment 以及类似于传入 startActivityForResult 方法的请求代码。需要时,目标 fragment 使用请求代码确认是哪个 fragment 在回传数据。
且目标 fragment 和请求代码由 FragmentManager 负责跟踪管理,我们可调用 fragment (设置目标 fragment 的 fragment)的 getTargetFragment 方法和 getTargetRequestCode 方法获取他们。
通过这段代码进行目标 fragment 的绑定:
fragment.setTargetFragment(ArticleFragment.this, REQUEST_DATE);
通过这段代码在目标 fragment 即可通过 intent 来回传数据。
getTargetFragment().onActivityResult(getTargetRequestCode(), resultCode, intent);
并且当子 fragment 通过 Fragment.onActivityResult 方法回传数据时,应重写父 fragment 中的 onActivityResult 方法来获取数据。
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != Activity.RESULT_OK){
return;
}
if (requestCode == REQUEST_DATE){
Date date = (Date) data.getSerializableExtra(DatePickerFragment.EXTRA_DATE);
mArticle.setDate(date);
mSubmit.setText(mArticle.getDate().toString());
}
}
6.4 对话框 DatePicker 中的时间信息转换
(1)当初始化 DatePicker 中的时间信息时,因为 Data 是时间戳,而 DatePicker 接收的是 年、月、日 这样的整数形式,所以我们需要做一些相应的转换。
首先通过 Calendar.getInstance 的方法来获取一个 Calendar 工具类对象,之后通过 Calendar.setTime 方法来将 Date 类型的数据填入,之后再通过使用 Calendar.get( Calendar.YEAR ) 类似的方法即可获取到整数的年月日相关信息。
之后再进行 DatePicker 组件的实例化,通过使用 DatePicker.init 方法,依次填入年月日的整型数据即可完成 DatePicker 的时间初始化。
(2)当需要获取 DatePicker 中用户所选则的时间信息时,只需使用 DatePicker.getYear 等方法,即可获取年月日等整型时间信息。
如果需要将整型年月日信息转化为 Date 时间戳时,可以通过实例化( new )使用 GregorianCalendar 类并使用其 getTime 方法完成。