CriminalIntentAPP的又一次革命

经过了前面五章代码的编写与结构的梳理,这款app的界面已基本成型。接下来,我会对后面三章的内容进行分析,帮助同学们进一步地完善相关的功能,相信你们一定会喜欢后续的改变的。

第十二章:日期对话框,fragment数据传递

1、使用 DialogFragment

AppCompat兼容库能通过支持库的方式将部分最新系统的特色功能移植到Android旧版本系统中。

所以需要在 Porject Structure 中添加 appcompat-v7 的依赖!

2、创建 DialogFragment

建议将 AlertDialog 封装在 DialogFragment (Fragment的子类)实例中使用;

通过使用 FragmentManager 管理对话框,可以更灵活地显示对话框。

首先需要一个针对 dialog 的布局文件,如 DatePicker 作为根元素的 Dialog 用于选择日期。

<?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="wrap_content"     android:layout_height="wrap_content"     android:calendarViewShown="false">
</DatePicker>

然后新建一个父类是 DialogFragment 的类 DatePickerFragment,重写其中的 onCreateDialog 方法,返回一个AlertDialog

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {// 使用 LayoutInflater 引用布局文件创建用于显示 Dialog 的 ViewView v = LayoutInflater.from(getActivity()).inflate(R.layout.dialog_date, null);return new AlertDialog.Builder(getActivity()).setView(v) // 设置视图.setTitle(R.string.date_picker_title) //设置标题// 设置 OK 按钮,OnClickListener 暂时留空.setPositiveButton(android.R.string.ok, null)// 使用 Builder 的 create() 方法创建 Dialog 并返回
        .create();
}

在使用 DialogFragment 时,使用成员方法 show 来显示 dialog:

// 在 Fragment 中为 DatePickerFragment 添加一个 Tag
private static final String DIALOG_DATE = "DialogDate";
……
// 在 Fragment 内部获取 FragmentManager
FragmentManager manager = getFragmentManager();
DatePickerFragment dialog = new DatePickerFragment();
// 显示对话框
dialog.show(manager, DIALOG_DATE);

3、将数据传递到对话框

需要在 DatePickerFragment 中建立获取实例的 newInstance 方法,其中需要的参数是传递的信息即可,示例如下

// DatePickerFragment.javapublic static DatePickerFragment newInstance(Date date) {// 新建一个 Bundle 对象用于存放数据Bundle args = new Bundle();args.putSerializable(ARG_DATE, date);DatePickerFragment fragment = new DatePickerFragment();// 使用 fragment arguments 来传递参数
    fragment.setArguments(args);return fragment;
}

4、从对话框回传数据

设置目标 fragment,传递数据给目标 Fragment

处理由同一 activity 托管的两个 fragment 间的数据返回时,可借用Fragment.onActivityResult(...)方法。因此,直接调用目标 fragment 的Fragment.onActivityResult(...)方法,,就能实现数据的回传。

// DatePickerFragment.javapublic static final String EXTRA_DATE ="com.kniost.criminalintent.date";……
private void sendResult(int resultCode, Date date) {// 防止出错if (getTargetFragment() == null) {return; }Intent intent = new Intent();// 放置数据到 Intent 中
    intent.putExtra(EXTRA_DATE, date);// 获取目标 fragment,调用其 onActivityResult 方法,其中 RequestCode 是用 getTargetRequestCode 方法获取的,resultCode 是传入参数,intent 包含了数据
    getTargetFragment().onActivityResult(getTargetRequestCode(), resultCode, intent);
}// CrimeFragment.java

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {// 如果一切正常,调用 sendResult 的方法时传入的参数应该就是 Activity.RESULT_OK,所以不会直接 returnif (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());}
}

第十三章:工具栏,菜单,层级式导航

1、在 XML 文件中定义菜单

<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"><itemandroid:id="@+id/menu_item_new_crime"android:icon="@android:drawable/ic_menu_add"android:title="@string/new_crime"app:showAsAction="ifRoom|withText"/>
</menu>

 2、实例化菜单

在CrimeListFragment.java中,覆盖onCreateOptionsMenu(Menu, MenuInflater)方法,实例化fragment_crime_list.xml中定义的菜单,如下:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {super.onCreateOptionsMenu(menu, inflater);inflater.inflate(R.menu.fragment_crime_list, menu);
}

3、让菜单发挥作用

在初始化菜单后,我们已经能在应用界面上看到菜单了,现在需要让菜单能够有实际的作用,比如新增一个 Crime,要达到这个目的,我们需要做下面几件事:

  1. 在 Model 层增加一个新增的函数
  2. 在 Controller 层增加菜单监听

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {case R.id.menu_item_new_crime:Crime crime = new Crime();CrimeLab.get(getActivity()).addCrime(crime);Intent intent = CrimePagerActivity.newIntent(getActivity(), crime.getId());startActivity(intent);return true;default:super.onOptionsItemSelected(item);}
    }

第十四章:SQLite数据库的使用

基本框架:

其中基本步骤:

定义 CrimeTable 内部类数据、表字段(CrimeDbSchema.java)

package edu.niit.software.criminalintent.database;/*** Created by 666 on 2017/9/29.*/public class CrimeDbSchema {public static final class CrimeTable{public static final String NAME = "crimes";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 类(CrimeBaseHelper.java)

package edu.niit.software.criminalintent.database;import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;import edu.niit.software.criminalintent.database.CrimeDbSchema.CrimeTable;/*** Created by 666 on 2017/9/29.*/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){db.execSQL("create table " + CrimeTable.NAME + "(" + "_id integer primary key autoincrement ," +CrimeTable.Cols.UUID + "," +CrimeTable.Cols.TITLE + "," +CrimeTable.Cols.DATE + "," +CrimeTable.Cols.SOLVED + ")");}@Overridepublic void onUpgrade(SQLiteDatabase db , int oldVersion , int newVersion){}
}

通过这些代码与逻辑的整理,这款App的界面功能还能更强大哦

是不是很靓眼,最后祝大家在代码编写的途中都可以持之以恒,未来很美好,要努力哦!

转载于:https://www.cnblogs.com/xinjin/p/7673997.html

CriminalIntent项目的强大完善相关推荐

  1. CriminalIntent项目开发--后篇

    CriminalIntent项目开发--后篇 为Criminal Intent应用添加对话框 创建DiaologFragment,使用FragmentManager管理对话框,可以灵活的显示对话框. ...

  2. CriminalIntent项目的开发

    新项目的开发分一下几块: 1.UI设计以及fragment的引入 2.用RecyclerView显示列表 3.运用布局与组件创建用户界面 4.fragment argument的使用 5 .ViewP ...

  3. 黑马旅游网项目总结与完善后端(非maven构建)

    项目介绍:仿黑马旅游网,项目不是用maven构建的项目,数据库连接池使用的是c3p0不是druid,操作操作sql用的不是jdbcTemplate而是Apache的DBUtlis工具,json工具用的 ...

  4. nginx中配置angular项目_强大,Nginx配置一键生成

    推荐阅读: 关于 JVM,都有哪些面试最常考的点需要重点掌握? 面试却被 Java 基础难住了?不要怕,我来带你一起手撕面试官阿里一线架构师分享的技术图谱,进阶加薪全靠它 前因 关于Nginx部署.配 ...

  5. pr剪辑打开多个项目_强大的PR版本转换神器来了,太厉害了!

    此项目是使用新版本Adobe premiere Pro 保存的,无法在此版本中打开. 这个问题,应该经常很多人都有遇到过吧?在我们工作中,经常遇到这种情况,低版本软件打不开高版本的工程文件.想装高版本 ...

  6. 带你学会C++文字页面类项目——4.整体完善与项目1

    目录

  7. 2021-08-13——最终项目(待完善)-对比21世纪中美两国在夏季奥运会上的奖(金)牌数量

    21世纪中国与美国夏季奥运会金牌变化图 数据爬取--腾讯体育网 所用excel表格数据为自制(最后对比使的文件数据有更改) 奥运会 金牌数(中国) 奖牌总数 2020东京 38 88 2016里约 2 ...

  8. 绝了!Dataway让 SpringBoot 变得更强大!

    作者:哈库纳   来源:my.oschina.net/ta8210/blog/3234639 Dataway介绍 Dataway 是基于 DataQL 服务聚合能力,为应用提供的一个接口配置工具.使得 ...

  9. Database2Sharp重要更新之完善EnterpriseLibrary架构代码

    该软件很早就开始支持Enterprise Library的数据访问操作了,不过之前的没有生成一个完整的解决方案工程,只是生成了数据访问类和实体类,改善后的Enterprise Library代码生成, ...

最新文章

  1. 使用DOM方法实现多附件上传客户端
  2. [leetcode] 68.二叉树的最近公共祖先
  3. eclipse java工程目录_转载:Eclipse下的java工程目录
  4. php写入word文档内容,如何在PHP中读取和写入WORD文档
  5. 获取别人_职场潜规则:要想获取别人信任与更多机会,先要学会勇于承担责任...
  6. 挖没写过的代码记录_holo_springboot
  7. 软件测试面试题之自动化测试题大合集(上)
  8. 大学排行引发大争议,谁在给大学排座次?
  9. Occlusion Culling(遮挡剔除)
  10. gitlab报错502
  11. 【重要】 性能测试设计能力解决方案
  12. 均方根误差(RMSE)、平均绝对误差(MAE)、标准差
  13. TI公司之DSP结构与芯片
  14. 华为2019年第一季度业绩曝光;联想and谷歌加入英特尔新晋云计划;即特斯拉起火,蔚来ES8也维修起了火...
  15. 【12月英语——快乐中学习】
  16. [jzoj 5353] 村通网 {kruskal算法}
  17. win10无法登陆到你的账户
  18. 用计算机来唱歌,一种利用计算机软件自动教学乐器和唱歌的方法与流程
  19. 气象绘图软件Panoply使用教程 (不定时更新)
  20. MDICT的100G的辞典资源_我是亲民_新浪博客

热门文章

  1. 解决mysql 1032 主从错误
  2. 被程序员忽视的位运算
  3. 【探索PowerShell 】【六】脚本基础简要
  4. 为什么说中国式报表特殊-5.4 填报
  5. 整理的常用JAVA开源库简介
  6. 一个不错的资源共享微盘
  7. 【转】正则表达式简介及在C++11中的简单使用教程
  8. Linux内核中的进程组及会话
  9. Isilon三款新品构建数据湖2.0策略
  10. Centos-Glassfish安装