Android入门笔记(六)

六、对话框的使用 和 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 方法完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值