[android]从书中编码方式,看编程思想
《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); }
优美的思想,带来优美的代码,希望自己以后在编写程序时,注意解耦合。
……
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· C# 13 中的新增功能实操
· Ollama本地部署大模型总结
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(4)
· langchain0.3教程:从0到1打造一个智能聊天机器人
· 2025成都.NET开发者Connect圆满结束