CriminalIntent项目的强大完善
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,要達到這個目的,我們需要做下面幾件事:
?
在 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项目的强大完善的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面试题27. 二叉树的镜像
- 下一篇: mingW与cygwin