《Android权威编程指南第3版》今天学习到第10章,感叹经验丰富的编程理念——解耦合。
编程理念肯定是尽可能解除耦合,让代码可以复用,书中多次提到关于参数传递的解耦,这又出现一次。
本章内容以Fragment为主,讲解如何从Fragment中调用其他Activity并传递参数crime_id。(PS:我以为直接通过FragmentManager加载,没想到还是调用Activity)
以上为背景,下面代码片段:
1.从实现RecyclerView的Fragment中,点击标签调用详情显示的Activity。
public void onClick(View v) { Intent intent = CrimeActivity.newIntent(getActivity(),mCrime.getId()); startActivity(intent); }
Holder中的Onclick,注意红色部分,相关代码实现如下:
private static final String EXTRA_CRIME_ID = "com.aocshallo.cp7.crimeactivity.crime_id"; public static Intent newIntent(Context pageContext, UUID crime_id){ Intent intent = new Intent(pageContext, CrimeActivity.class); intent.putExtra(EXTRA_CRIME_ID, crime_id); return intent; }
以上内容完全可以直接录入到Holder当中,但这样带来信息的绑定,因为Holder并不关心你是如何实现的,它关心的是我要给你什么参数,至于实现过程是和Holder没有任何关系的,如果直接写入Holder,Holder就和Activity绑定,不利于解耦。所以,定义了一个静态方法newIntent,它的作用是实现初始化Intent,对相关参数处理(将crime_id存入Extra中),这样做Holder就不用管如果创建一个符合Activity要求的Intent了,因为给Activity一个crime_id,Activity里已经内部处理好了,返回一个Intent,你直接用就行了。至少Intent怎么实现的,Holder不知道也不关心,它只管给参数得到Intent,然后调用。
对于Activity来讲,只有自己清楚这个crime_id是如何存贮的,因为用也是自己用。使用代码如下:
protected Fragment createFragment() { UUID crime_id = (UUID)getIntent().getSerializableExtra(EXTRA_CRIME_ID); return CrimeFragment.newInstance(crime_id); }
这里因为有父类具体实现FragmentManager如何创建、使用。Activity里只要覆盖createFragment方法即可,这里红色代码部分正是用到了上一步存入Extra的crime_id。
存贮、使用都在Activity内部实现,这样一旦处理方式发生变化,在Activity内部即可完成修正,不影响Holder的调用代码;
相关方法、常量也只在Activity内容使用,不会暴露给Activity以外的区域,保证了安全性。
代码中黄底部分,也是利用同样的方法,Activity不关心Fragment如何使用,你自己决定,我给你传Crime_id,你处理就好。
public static CrimeFragment newInstance(UUID crimeId) { Bundle args = new Bundle(); args.putSerializable(ARG_CRIME_ID, crimeId); CrimeFragment fragment = new CrimeFragment(); fragment.setArguments(args); return fragment; }
Fragment里使用Bundle来处理参数传递,通过CrimeLib提取Crime
@Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); UUID crimeId = (UUID) getArguments().getSerializable(ARG_CRIME_ID); mCrime = CrimeLib.get(getActivity()).getCrime(crimeId); }
优美的思想,带来优美的代码,希望自己以后在编写程序时,注意解耦合。
……