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,代码如下:
如上代码所示,既然是改日期,那我们选的控件自然是DatePicker,布局文件如下:
AlertDialog的界面就加载上面的布局。
还有那个具体年月日的获取,因为date.getYear()之类的方法已被废弃,所以我们采用Calendar来获取相应的年月日。
为了完成数据的同步除了上面DatePickerFragment的sendResult方法,我们还需要在ItemFragment中重写接受的方法,代码如下:
其中resultCode是判断是否成功,requestCode是判断是否是我们要的日期数据。
此外还要对按钮监听的代码做如下修改,将ItemFragment设为“TargetFragment”,代码如下:
为了和书上的知识点讲解结合起来,我也在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"); } });
相关文章推荐
- Android中fragment实现按钮点击事件
- Android 放大镜效果实现原理
- Android中防止Toast重复显示的问题
- 本文介绍Android中Intent的各种常见作用
- AndroidStudio快捷键
- android-Notification点击跳转Activity
- 【android】Cursor记录集游标、ListView和SimpleCursorAdapter、ListView数据动态更新
- Android笔记(8)---Fragment的使用(静态加载,动态加载)
- android 计数器---定时执行任务
- Android中TouchEvent触摸事件机制
- Android自动电话录音开发过程及问题
- Android SurfaceView使用dirty rect刷新
- Android Studio 错误 Duplicate files copied in APK META-INF/LICENSE.txt
- 【android】获取屏幕宽和高
- android-NFC Basics
- Android读书笔记之ViewPager的使用
- android-Near Field Communication(NFC)
- android intent 跳转到第三方应用 如果第三方应用已经启动,但是隐藏在home下,如何让它显示出来?
- Android项目更改包名
- 分享Android中pullToRefresh的使用心得