您的位置:首页 > 移动开发 > Android开发

Android读书笔记之对话框的使用

2015-12-20 16:55 357 查看
该读书笔记是自己阅读《Android编程权威指南》和《The.Big.Nerd.Ranch.Guide.2nd.Edition》(《Android编程权威指南》第二版)所做的一些笔记。

为了和书上的知识点讲解结合起来,我也在Item中加入了日期,并将该日期数据显示在按钮上。我们现在要做的工作就是当用户点击按钮是能够弹出一个对话框,然后通过这个对话框能够修改日期。

为了实现上面的功能,一个自然是对话框,还有一个就是数据的同步,因为我们是将DialogFragment和ItemFragment都托管在PagerActivi上的,所以我们在DialogFragment中修改了的数据首先要送回到ItemFragment,然后在ItemFragment中再修改相应的Item的数据。

首先我们创建一个继承自DialogFragment的DatePickerFragment,代码如下:

package com.example.zhan.fragmenttest;

import android.app.Activity;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.DatePicker;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

/**
* Created by zhang on 12/19/2015.
*/
public class DatePickerFragment extends DialogFragment {

private static final String ARG_DATE = "date";

//将修改了的日期数据传回ItemFragment时使用
public static final String EXTRA_DATA =
"com.example.zhan.fragmenttest.datepickerfragment.data";

private DatePicker datePicker;

//避免每次产生DatePickerFragment实例都要重写下面的代码
//而且可以让ARG_DATE只写一次。。。。(主要是因为Fragment.setArguments(Bundle)方法必须在fragment创建后、添加给activity前完成)
public static DatePickerFragment newInstance(Date date) {
Bundle args = new Bundle();
args.putSerializable(ARG_DATE, date);

DatePickerFragment datePickerFragment = new DatePickerFragment();
datePickerFragment.setArguments(args);
return datePickerFragment;
}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

final Date date = (Date) getArguments().getSerializable(ARG_DATE);

Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);

View view = LayoutInflater.from(getActivity()).inflate(R.layout.dialog_date, null);
datePicker = (DatePicker) view.findViewById(R.id.dialog_date_date_picker);
datePicker.init(year, month, day, null);

return new AlertDialog.Builder(getActivity())
.setView(view)
.setTitle(R.string.date_picker_title)
.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
int year = datePicker.getYear();
int month = datePicker.getMonth();
int day = datePicker.getDayOfMonth();
Date date = new GregorianCalendar(year,month,day).getTime();
sendResult(Activity.RESULT_OK,date);
}
})
.create();
}

//将修改了的数据返回到ItemFragment
private void sendResult(int resultCode,Date date) {
if (getTargetFragment() == null) {
return;
}

Intent intent = new Intent();
intent.putExtra(EXTRA_DATA,date);

getTargetFragment().onActivityResult(getTargetRequestCode(),resultCode,intent);
}

}


如上代码所示,既然是改日期,那我们选的控件自然是DatePicker,布局文件如下:

<?xml version="1.0" encoding="utf-8"?>
<DatePicker xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/dialog_date_date_picker"
android:layout_width="match_parent"
android:layout_height="match_parent">

</DatePicker>


AlertDialog的界面就加载上面的布局。

还有那个具体年月日的获取,因为date.getYear()之类的方法已被废弃,所以我们采用Calendar来获取相应的年月日。

为了完成数据的同步除了上面DatePickerFragment的sendResult方法,我们还需要在ItemFragment中重写接受的方法,代码如下:

//获取来自DatePickerFragment的修改了后的日期数据
@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_DATA);
mItem.setDate(date);
mDateButton.setText(mItem.getDate().toString());
}
}


其中resultCode是判断是否成功,requestCode是判断是否是我们要的日期数据。

此外还要对按钮监听的代码做如下修改,将ItemFragment设为“TargetFragment”,代码如下:

mDateButton.setText(mItem.getDate().toString());
mDateButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager fragmentManager = getFragmentManager();
DatePickerFragment datePickerFragment =
DatePickerFragment.newInstance(mItem.getDate());
//以后datePickerFragment对数据做出的改变,返回到ItemFragment这个Fragment
datePickerFragment.setTargetFragment(ItemFragment.this,REQUEST_DATE);
datePickerFragment.show(fragmentManager,"csa");
}
});
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: