安卓權威編程 挑戰練習13.6
阿新 • • 發佈:2017-07-15
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