CriminalIntent项目开发--后篇

为Criminal Intent应用添加对话框

  • 创建DiaologFragment,使用FragmentManager管理对话框,可以灵活的显示对话框。

要显示对话框我们需要完成一些步骤:

  • 创建DatePickerFragment类;
public class DatePickerFragment extends DialogFragment {@Overridepublic Dialog onCreateDialog(Bundle saveInstanceState){return new AlertDialog.Builder(getActivity()).setView(v).setTitle(R.string.date_picker_title).setPositiveButton(android.R.string.ok,.create();}
  • 创建AlertDialog;
public Dialog onCreateDialog(Bundle saveInstanceState){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 v = LayoutInflater.from(getActivity()).inflate(R.layout.dialog_date,null);mDatePicker = (DatePicker) v.findViewById(R.id.dialog_date_picker);mDatePicker.init(year,month,day,null);return new AlertDialog.Builder(getActivity()).setView(v).setTitle(R.string.date_picker_title).setPositiveButton(android.R.string.ok,new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {int year = mDatePicker.getYear();int month = mDatePicker.getMonth();int day = mDatePicker.getDayOfMonth();Date date = new GregorianCalendar(year,month,day).getTime();sendResult(Activity.RESULT_OK,date);}}).create();}
  • 借助FragmentManager在屏幕上显示对话框
mDateButton.setOnClickListener(new View.OnClickListener(){@Overridepublic void onClick(View v){FragmentManager manager = getFragmentManager();DatePickerFragment dialog =DatePickerFragment.newInstance(mCrime.getDate());dialog.setTargetFragment(CrimeFragment.this,REQUEST_DATE);dialog.show(manager,DIALOG_DATE);}

Fragment间的数据传递

  • 前面我们实现了activity间以及fragment的activity间的数据传递。现在需要实现同一activity托管的两个fragment间的数据传递
传递数据给DataPickerFragment
  • 传递crime的日期给Fragment,需新建一个newInstance(Date)方法,然后将Date作为argument附件给Fragment。为了返回新的日期给Fragment并更新模型层以及对应的视图,需要将日期打包为extra并附加到Intent上,然后调用Fragment.onActivityResult(...)的方法,并传入准备好的Intent参数。
private static final String ARG_DATE = "date";
private DatePicker mDatePicker;
public static DatePickerFragment newInstance(Date date) {
Bundle args = new Bundle();
args.putSerializable(ARG_DATE, date);DatePickerFragment fragment = new DatePickerFragment();
fragment.setArguments(args);
return fragment;
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) { //创建了AlertDialog的实例
//CrimeFragment向DatePickerFragment传递日期
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);
返回数据给CrimeFragment
  • 设置目标Fragment
private static final int REQUEST_DATE = 0;
  • 传递数据给目标Fragment
public static final String EXTRA_DATE ="com.example.criminalintent.date";
​ private void sendResult(int resultCode, Date date) {
if (getTargetFragment() == null) {
return;
}
Intent intent = new Intent();
intent.putExtra(EXTRA_DATE, date);
getTargetFragment().onActivityResult(getTargetRequestCode(), resultCode, intent);}
  • 响应对话框
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
//super.onActivityResult(requestCode, resultCode, data);
if (resultCode != Activity.RESULT_OK) {
return;
}
if (requestCode == REQUEST_DATE) {
Date date = (Date) data.getSerializableExtra(DatePickerFragment.EXTRA_DATE);
mCrime.setDate(date);
mDateButton.setText(mCrime.getDate().toString());
//updateDate();
}

SQLite数据库的使用

  • SQLite是类似于MySQL和Postgresql的开源关系型数据库。不同于其他数据库的是,SQLite使用单个文件存储数据,使用SQLite库读取数据。
    Android标准库包含SQLite库以及配套的一些Java辅助类。

定义schema

  • 定义 CrimeTable 内部类(CrimeTable 内部类唯一的用途就是定义描述数据表元素的 String 常量。首先要定义的是数据库表名(CrimeTable.NAME))
public class CrimeDbSchema {
public static final class CrimeTable {
public static final String NAME = "crimes";
}
}
  • 定义数据表字段(有了这些数据表元素就可以在Java代码中安全的引用)
public static final class Cols {
public static final String UUID = "uuid";
public static final String TITLE = "title";
public static final String DATE = "date";
public static final String SOLVED = "solved";
}

创建初始数据库

  • 创建CrimeBaseHelper 类(用于简单打开SQLiteDatabase)并打开SQLiteDatabase
public class CrimeBaseHelper extends SQLiteOpenHelper {private static final int VERSION = 1;private static final String DATABASE_NAME = "crimeBase.db";public CrimeBaseHelper(Context context) {super(context, DATABASE_NAME, null, VERSION);}@Overridepublic void onCreate(SQLiteDatabase db) {}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}
}
public class CrimeLab {private static CrimeLab sCrimeLab;private List<Crime> mCrimes;private Context mContext;private SQLiteDatabase mDatabase;...private CrimeLab(Context context) {mContext = context.getApplicationContext();mDatabase = new CrimeBaseHelper(mContext).getWritableDatabase();mCrimes = new ArrayList<>();
}

写入数据库

  • 使用ContentValues
private static ContentValues getContentValues(Crime crime) {ContentValues values = new ContentValues();values.put(CrimeTable.Cols.UUID, crime.getId().toString());values.put(CrimeTable.Cols.TITLE, crime.getTitle());values.put(CrimeTable.Cols.DATE, crime.getDate().getTime());values.put(CrimeTable.Cols.SOLVED, crime.isSolved() ? 1 : 0);return values;
}
  • 插入和更新记录并刷新
public void addCrime(Crime c) {ContentValues values = getContentValues(c);mDatabase.insert(CrimeTable.NAME, null, values);
}
public void updateCrime(Crime crime) {String uuidString = crime.getId().toString();ContentValues values = getContentValues(crime);mDatabase.update(CrimeTable.NAME, values,CrimeTable.Cols.UUID + " = ?",new String[] { uuidString });
}
@Override
public void onPause() {super.onPause();CrimeLab.get(getActivity()).updateCrime(mCrime);
}    

完成后我们便可以储存数据在APP中

转载于:https://www.cnblogs.com/wypboke/p/7670699.html

CriminalIntent项目开发--后篇相关推荐

  1. python3 项目开发-中级篇(二)

    本篇内容讲述图形化界面的聊天室的搭建过程. 用到的知识点: 1,tkinter模块 2,udp协议构建聊天室 3,多进程接收消息和发送消息 4,进程间的通信 难点: 1,用tkinter编写的图形化界 ...

  2. 硬件项目开发 datasheet篇

    Datasheet(数据手册):电子元器件或者芯片的数据手册规格书,一般由厂家编写,格式一般为PDF,内容包括性能介绍,如电气参数.物理参数等(主要讲芯片可以做什么用).引脚功能及管脚定义(要画原理图 ...

  3. 【第四周作业】参加项目开发之后的一些体会

    在参加项目开发之前,我没有任何的软件开发经验,所以这次参加项目开发完全是从零开始,从头学起. 这周上课时讲到了软件开发的过程中要注重高内聚.低耦合,这让我联想到了我的项目开发工作.在这次的项目开发中, ...

  4. FPGA项目开发:204B实战应用-LMK04821代码详解(二)

    大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分.大侠可以关注FPGA技术江湖,在"闯荡江湖"."行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢. ...

  5. iOS开发拓展篇——如何把项目托管到GitHub

    iOS开发拓展篇--如何把项目托管到GitHub 说明:本文主要介绍如何把一个OC项目托管到Github,重操作轻理论. 第一步:先注册一个Github的账号,这是必须的 注册地址:Github官网注 ...

  6. Vue项目实战 —— 哔哩哔哩移动端开发—— 第一篇

    目录 前言完 效果图 : 登录含签权 注册带正则 个人中心 下拉加载更多主页 修改个人中心 视频播放加关注+收藏 评论盖楼A回复B B回复C C回复A类似 项目开始 封装登录.注册 封装登录 从零到一 ...

  7. [原创].NET 业务框架开发实战之十 第一阶段总结,深入浅出,水到渠成(后篇)...

    .NET 业务框架开发实战之十 第一阶段总结,深入浅出,水到渠成(后篇) 前言:接着上篇来. 系列文章链接: [原创].NET 分布式架构开发实战之一 故事起源 [原创].NET 分布式架构开发实战之 ...

  8. 告诉老默我想学Spring Cloud了(新手篇):从0到1搭建Spring Cloud项目(实际项目开发的浓缩精华版)

    告诉老默我想学Spring Cloud了(新手篇):从0到1搭建Spring Cloud项目 一.前言 二.如何选择版本 2.1 SpringCloud 和 Spring Boot 版本选型 2.1. ...

  9. ABAP项目砖家之旅-语法和开发对象篇

    ABAP项目砖家之旅-语法和开发对象篇 前言 一.基本语法 二.开发对象及其语法 1.底层数据类型 2.数据表.视图.数据元素.数据域.数据类型 1.1数据类型dataTypes 1.2数据域data ...

最新文章

  1. python编程问题--第四次
  2. VS2017+OpenCV3.4.0 折腾(5)
  3. 完全详解--Silverlight 下载文件
  4. Openstack 实现技术分解 (1) 开发环境 — Devstack 部署案例详解
  5. Android开发中adb启动失败adb连接异常的解决办法
  6. Transformer解析
  7. 用 Python 写个坦克大战
  8. MATLAB中的柱面与球面
  9. 错误:无法与 SFTP 服务器建立 FTP 连接
  10. H264的RTP负载打包的数据包格式,分组,分片
  11. 白鹭发布html5,白鹭Egret Engine 1.5发布 HTML5性能大幅提升
  12. 【华为OJ】【算法总篇章】
  13. Linux使用Wget实现整站下载
  14. 简单易懂Kafka搭建
  15. 职场001 什么时候跳槽
  16. 实战1-数据项目分析流程
  17. 我叫MT4怎么在电脑上玩?我叫MT4手游安卓模拟器电脑版操作教程
  18. NXP JN5189 ZigBee 3.0开发环境搭建(续)
  19. python预测模型
  20. 2019年8月8日星期四(系统编程)

热门文章

  1. word2007-2010排版中解决段后插入分页符 新页首行空行问题
  2. 写给那些正奔三的80后[转]
  3. 展望未来,总结过去10年的程序员生涯,给程序员小弟弟小妹妹们的一些总结性忠告...
  4. Kubernetes系统架构简介
  5. ubuntu 14.04 安装 cuda 6.5
  6. GB2312、GBK与UTF-8的区别
  7. vc新线程、类外控制EDIT控件
  8. JavaScript 学习笔记3
  9. android广播接收器
  10. Java 复习 —— JMM基础