美文网首页
android开发:google提供的FragmentBasic

android开发:google提供的FragmentBasic

作者: 夏广成 | 来源:发表于2017-03-14 15:32 被阅读136次

最近公司业务调整,开发人员要从业务型转变为技术型,那么具体到个人,我就计划把google文档重头读一遍,来完成当年吹下的一些牛皮。在阅读的过程中,看到了google提供的一些demo,也会试着download下来,跑一把。但是在看到Fragment的篇章时,却发现google提供的FragmentBasics.zip 中的代码其实是有bug的。

一:bug再现:

*下载地址: FragmentBasic.zip


这个demo 主要展示了,在宽屏和窄屏之间,应用可以加载不同的layout,配合代码,来实现适配。当笔者在窄屏上演示时,完全没有问题,但是当笔者将窄屏文件和宽屏文件置换,并处理相关业务代码逻辑之后,笔者这里确保了在改动的代码中没有任何bug,也就是相当于使用了宽屏手机来演示demo之后,发现demo并不能像google介绍的那样运行,而是在点击标题之后,立即奔溃,并没有像窄屏显示的那样——将标题对应的文章详情显示出来。

Paste_Image.png

如上图所示,当用户点击两个标题时,demo就会奔溃。这个时候当我想去查看日志时,发现logcat也因为奔溃而无法正常输出日志。

adb logcat -d > logcat.txt

通过上面这行命令,就可以将缓存在内存中的logcat日志重新定向到logcat.txt 文件中了。通过日志输出,我们可以定义到奔溃是因为当我们点击Article one这样的一个标题时,调用了ArticleFragment中的updateArticleView(int position)方法。在这个方法中,获取显示文章详情的textview对象:

TextView article = (TextView) getActivity().findViewById(R.id.article);

此时通过getActivity().findViewById()获取的对象,其实null,因此出现了空指针。

二:分析原因

Paste_Image.png

最开始我一直以为是自己修改代码导致的,后来google一下,发现在stackoverflow上,早就有人遇到了。但是前辈们只指明了bug之所在,并没有分析具体原因。


其实在窄屏手机上,之所以调用getActivity()可以获取textview对象,是因为在窄屏手机上demo中的代码执行的是通过FragmentManager的事务来完成fragment替换的。
但是在宽屏模式下,demo中的代码却是通过在布局中设置fragment的映射,来完成fragment的实例的。


发现了二者的区别之后,我就动手开始将宽屏中的layout中的fragment映射,换成了代码中通过FragmentManager()事务管理来替换fragment,结果证实了我的猜想。通过getActivity().findViewById()来获取之前报了空指针的对象,就不再报空指针了。

您能读到这里,对我已是莫大鼓励,点个喜欢,请勿打赏####

相关文章

网友评论

      本文标题:android开发:google提供的FragmentBasic

      本文链接:https://www.haomeiwen.com/subject/qthhnttx.html