ios里的UITableView,功能是很强大的。但是没有Android类似Grid的效果。比如类似解决ListView滚动卡的问题。因为UITableView的每行只支持显示一个视图。如果细粒度的比如类似gallery的效果,就需要自己解决了。
最近写的一个类似效果的原型:
主要解决了:
- 如何生成grid的样式
- 图片的阴影效果
写这个例子的目的是供同事和开发Android的朋友学习借鉴。
这个版本不是凭空冒出来的,就像爱因斯坦做手工的故事(不知道的见这里)一样,还有更丑的“小凳子”,它们是:
参考它们可以了解版本的演进过程。可能降低学习曲线。
这个版本的首页:
点击条目,会弹出带图片的详细信息界面:
这里的图片是从维基百科直接下载的,并会缓存在本地。
另外,就是对横竖屏使用了不同的布局:
android 3.0 sdk,引入了很多新api,比如Loader。和Fragment类似(编写兼容android1.6的fragment),该api也可在android 1.6以上版本执行。
以下介绍如何编写Loader,实现对ListView的异步加载。效果如图:
示例中有一个后台线程每隔3秒更新数据库的长江记录,将记录改为“长江”或“Long River”。ListView无需监控数据库变化,基于Loader,会自动更新。实际上这里面是观察者模式,无非是系统自带了,只需调用即可,无需自己构造观察者。
这个示例也是完整的sqlite+content provider+cursor adapter+listview+loader组合示例。
日志引用
在在视图显示中使用Style中,使用的是针对一个视图指定元素的样式。如果要针对整个Activity,对它的背景颜色和字体等做统一的样式约定,就需要使用另外一个技术,theme。
以下示例就是在在视图显示中使用Style基础上增加了theme。
如果视图界面风格需要统一的规划,就需要使用android视图技术中的style。这类似HTML技术和CSS技术的关系。
示例改编自简单使用SimpleCursorAdapter。示例截图如下:
如果使用Sqlite,建议和ContentProvider结合使用。这样数据库的生命周期就不用自己管了。然后,如果要在比如ListView中显示,可以使用CursorAdapter。简化的办法是使用子类SimpleCursorAdapter。
以下就介绍一下使用sqlite+content provider+cursor adapter的最简单实现示例。太简单了,示例如图:
在通过声明方式在Android 3.0上使用Fragment中写的例子只能用在android3.0以上的版本。之前也测试过兼容1.6的方式,见编写最简单的Fragment。现在修改了android3.0的示例,可以兼容1.6版本了。
这是在nexus one 2.3.3下的截屏。项目本身使用的sdk是1.6。
Mac环境下有一个强大的自然语言脚本工具,AppleScript。用它能干什么?
看看我写的简单脚本:
say "Marshal is a programmer. You can visit his blog"
tell application "Google Chrome"
set URL of active tab of window 1 to "http://marshal.easymorse.com"
activate
end tell
运行脚本,系统会先朗读第一行。随后打开google chrome浏览器,将当前的tab页面加载为我的博客首页。如果没有启动google chrome,则启动并创建新的tab。
在编写最简单的Fragment中使用的环境是1.6到2.3的。为了比较正式的学习一下Fragment的使用,在Android 3.0平板模拟器上开发了一个示例:
使用Fragment可以有两种方式,即:
- 通过布局xml文件,将fragment声明到布局里,这样fragment生命周期和Activity是绑定的
- 通过编程方式,自己可以灵活处理在Activity内的fragment生命周期,缺点是可能因为复杂的生命周期管理带来不可预期的效果,比如[cref 4096]示例
以下翻译自《Professional Android 2 Application Development》第四章Create user interfaces的Optimizing Layouts部分。
通过inflate在Activity中布局是个有性能消耗的过程。每增加一个嵌套的布局和视图都会对应用的性能造成很大的影响。
总之,好的实践是尽量保持布局尽可能简单,尤其是要避免嵌套inflate操作整个新的布局,这是为更新已经存在布局的小变化。
以下几点是包含在Android最佳实践指导原则里的,当然并不绝对:
- 避免不必要的嵌套:不要把一个布局放置在其他布局里,除非是必要的。
- 避免使用太多视图:在一个布局中每增加一个新的视图,都会在inflate操作时耗时和消耗资源。任何时候都不要在一个布局中包含超过80个视图,否则,消耗在inflate操作上的时间会很大。
- 避免深度嵌套:布局可以任意嵌套,这极易于创建复杂和深度嵌套的布局层次。如果没有硬性限制,将嵌套限制在10层以下是好的实践。
优化布局层次,比如减少没效率的或者不必要的嵌套布局,是十分重要的。
Android SDK包含了layoutopt,一个命令行工具,来辅助这个优化工作。运行该命令,参数是布局文件或者布局文件的目录,将分析并给出改善的建议。