Shawlaw的Android周记 2016年7月31日

1、GridView的ItemView里的Margin无作用。

      原因:GridView属于AbsListView的子类,而ItemView在getView的时候会取所属父View(此处即GridView)的LayoutParams为自己的View对象的LayoutParams,然后AbsListView类的LayoutParams里是不包含Margin属性的,所以在生成ItemView的时候,在xml里定义的Margin值就被“吞掉”了。

      解决方案:用GridView自带的HorizontalSpacing和VerticalSpacing属性来确定各ItemView之间的间隔。


2、Fragment内的AdapterView的Adapter建议在onCreate回调实例化,而不是在onCreateView回调处实例化。

      原因:Fragment的View可能会在自身的生命周期内多处被create和destroy,而Adapter身为关联数据与View的中介,应当是与Fragment实例共“生死”,而不是仅仅和Fragment的View共“生死”;当View被create或destroy的时候,Adapter应当更新外部可能被改变的数据(如数据库、SharePreference或者文件之类的),而自身在内存保存的数据则应当不改变(如一些只在用户交互时使用到的状态表之类的无需永久存储的数据),所以在onCreateView回调中只应更新数据,而不是重新实例化Adapter。


3、对于Resources类的getColor(id)、getDrawable(id)之类的在自Android 6.0甚至5.1系统上就被声明是deprecated的方法,如若不想每次调用时都手工区分SDK版本的话,可以使用v4 support包里的ContextCompat类的同名方法,它会帮你完成区分SDK版本然后调用不同方法的工作。


4、如果需要获得整个存储空间(内置存储或外置存储如tf卡,而且是根目录)的已用大小和总大小等,可以使用StatFs类;但这个方法不支持查询某个子文件夹的大小,某个非根目录的目录的所占空间,仍旧需要递归遍历其中所有文件,求和File对象的length()方法返回值来获得;注意官方文档有提到目录的File对象的length()方法的返回值是不确定的,所以不要直接用文件夹的length()来作为文件夹大小。


5、要在后台定时执行耗时操作的时候,可以考虑使用HandlerThread和Handler来实现。


6、在使用Android Studio进行开发的时候,在界面设计时,可以使用tools命名空间来协助在编辑器中预览界面效果,如在各类AbsListView中添加tools:listitem来预览自定义的ItemView在其中的界面效果;tools命名空间的可用属性包括所有android命名空间的可用属性,而且由于目前Android Studio还不支持tools命名空间属性的自动补全,所以建议先使用android命名空间写好属性再替换命名空间为tools;而且tools命名空间的属性仅用于也仅有效于在IDE开发时的预览效果,在打包后、运行中的应用里,是完全不含tools命名空间的属性的。

你可能感兴趣的:(Shawlaw的Android周记 2016年7月31日)