1. 程式人生 > >安卓權威編程 挑戰練習13.6

安卓權威編程 挑戰練習13.6

mes extend option 移除 原因 mef onclick rime items

挑戰練習:刪除crime記錄

CriminalIntent引用目前不支持刪除現有crimes記錄,請為CrimeFragment添加菜單項,允許用戶刪除當前記錄,用戶點擊刪除菜單項後,記得調用CrimeFragment托管活動的finish方法回退到前一個activity界面.

首先為Crime增加一個菜單項。

在menu文件夾下創建一個名為crimefragment_crime的布局文件,代碼如下:

<?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"> <item android:id="@+id/delete" android:title="delete" app:showAsAction="ifRoom"/> </menu>

之後在CrimeFragment中添加如下代碼讓菜單項顯示出來:

1  @Override
2     public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
3 super.onCreateOptionsMenu(menu, inflater); 4 inflater.inflate(R.menu.crimefragment_crime,menu); 5 }

刪除crime記錄,需要在存放Crime對象的List刪除我們選中的條目。在CrimeLab中增加如下代碼:

1     public void removeCrime(UUID id){
2         Iterator<Crime> it = mCrimes.iterator();
3         while(it.hasNext()) {
4 Crime crime = it.next(); 5 if(crime.getId().equals(id)) { 6 it.remove(); 7 } 8 } 9 }

這裏新增了一個removeCrime()方法,根據傳入的UUID參數來找到我們選中的條目,然後在mCrimes集合中移除它。

之後在CrimeFragment中設置菜單項的點擊事件:

1 @Override
2     public boolean onOptionsItemSelected(MenuItem item) {
3 
4         switch (item.getItemId()) {
5             case R.id.delete:
6                 return true;
7             default: return  super.onOptionsItemSelected(item);
8         }
9     }

但是現在並沒有執行具體的刪除邏輯,原因是刪除操作需要一個UUID參數傳入。

在我們點擊CriminalIntent中的條目的時候,會執行CrimeHolder中的onClick()方法.

這個方法中的內容包含了我們需要的UUID參數。我們剛好需要的是點擊條目的UUID;

修改CrimeListFragment中的onClick()方法的代碼:

 1 private class CrimeHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
 2 
 3          ......
 4       
 5         @Override
 6         public void onClick(View v){
 7             Intent intent = CrimePagerActivity.newIntent(getActivity(),mCrime.getId());
 8             Bundle args = new Bundle();
 9             args.putSerializable("crime_id",mCrime.getId());
11             CrimeListFragment listFragment = new CrimeListFragment();
12             listFragment.setArguments(args);
13             startActivity(intent);
14         }
15       ......
16     
17     }
18         

這裏通過argument實現fragment之間的數據傳輸。

將所需的UUID參數存放到Bundle中。

這樣就可以通過getArguments()在另外的Fragment中獲取到Bundle對象 ,然後調用Bundle對象的getSerializable()方法就可以獲取到所傳入的UUID;

然後再來修改CrimeFragment中的onOptionsItemSeleted()方法。

 1 @Override
 2     public boolean onOptionsItemSelected(MenuItem item) {
 3 
 4         switch (item.getItemId()) {
 5             case R.id.delete:
 6 
 7                 UUID id = (UUID)getArguments().getSerializable("crime_id");
 9                 if(id!=null)
10                     CrimeLab.get(getActivity()).removeCrime(id);
11                 getActivity().finish();
12                 return true;
13             default: return  super.onOptionsItemSelected(item);
14         }
15     }

這裏首先獲取到UUID然後通過CrimeLab的removeCrime()方法將選中的條目刪除。

最後通過getActivity().finish() 方法回退到前一個activity界面。

安卓權威編程 挑戰練習13.6