安卓权威编程 挑战练习13.6
Posted mystic
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安卓权威编程 挑战练习13.6相关的知识,希望对你有一定的参考价值。
挑战练习:删除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的主要内容,如果未能解决你的问题,请参考以下文章