<style name="Theme.Foo" parent="android:style/Theme.Light">
<item name="android:windowContentOverlay">@null</item>
</style>
<activity android:name=".FooActivity"
android:theme="@style/Theme.Foo"> ...
初始化
tabHost = getTabHost();
TabSpec tabSpec = tabHost.newTabSpec("abc");
tabSpec.setIndicator("helloabc");
tabSpec.setContent(new MyViewFactory());
tabHost.addTab(tabSpec);
我想动态更换为
TabSpec tabSpec = MyTabActivity.getTabSpec();
tabSpec.setIndicator("xyz");
可是上面的方法不好用
要想修改需要用:
TextView title = (TextView) tabHost.getTabWidget().getChildAt(tabId).findViewById(android.R.id.title)
title.setText("xyz");
泛型开发已经是java编程中老生常谈的问题了,这里就不一一详细解释泛型的基础了。笔者在几年前也不知道泛型的好处,当时j2me并不支持泛型(如今亦是),直到写编辑器和服务器开发才渐渐接触和爱上java的泛型,虽然比起c++的泛型扔是相形见拙。好了简单的废话开场白结束之后我们开始介绍这个Command Factory.
这里笔者举例的一个工厂是用来处理上下行网络报文包的,暂时只给出下行解析的列子。
ManageObject类是一个通用对象接口,之后我们所有的Command皆要实现这个规范接口,最终通过我们的构建器来获取相应的Command。
package com.gameu.core; /** * 通用对象接口 * @author Tony * */ public interface ManageObject { /** * 获取对象创建时间戳 * @return 对象创建时间戳 */ long getCreateTime(); /** * 获取对象编号 * @return 对象统一编号 */ int getID(); /** * 获取对象名称 * @return 对象名称 */ String getName(); /** * 对象初始化 */ void initialize(); /** * 设置对象编号 * @param ID 对象统一编号 */ void setID(int ID); /** * 设置对象名称 * @param name 对象名称 */ void setName(String name); /** * 获取对象上次更新时间戳 * @return 上次更新时间戳 */ long getLastUpdateTime(); }
从上面代码中 我们不难看出 这就是一个普通得不能再普通的一个通用接口。里面有一些常用方法。之后我们要用我们的Command来实现。
接下来介绍一下 泛型对象调用的核心:池
package com.gameu.core; import java.util.Iterator; import java.util.Set; /** * 通用池化接口 * @author Tony */ public interface Poolable<T extends ManageObject> { /** * 是否包含目标ID * @param id 要查询的ID * @return 是/否 */ boolean contains(int id); /** * 池中是否包含目标名称 * @param name 要查询的名称 * @return 是/否 */ boolean contains(String name); /** * 池销毁方法 */ void destory(); /** * 通过目标ID检索关联的池对象 * @param id 目标ID * @return 关联的池对象 */ T get(int id); /** * 通过目标名称检索关联的池对象 * @param name 目标名称 * @return 关联的池对象 */ T get(String name); /** * 获取池名称 * @return 池名称 */ String getName(); /** * 池初始化方法 */ void initialize(); /** * 获取池的对象迭代器 * @return 池对象迭代器 */ Iterator<T> iterate(); /** * 获取池的的主键集合,用于便历 * @return 主键集合 */ Set<Long> keySet(); /** * 计算池长度,即池对象个数 * @return 池长度 */ int length(); /** * 从池中退出目标ID的对象 * @param id 目标ID * @return 目标对象 */ T pop(int id); /** * 从池中退出目标名称的对象 * @param name 目标名称 * @return 目标对象 */ T pop(String name); /** * 放入一个对象到池中 * @param value 目标对象 * @return 压入后更新的目标对象 */ T push(T value); /** * 更新池对象<br> * 根据功能不同,实现也不同:<br> * 如保存池,会根据将对象更新到数据库中.<br> * @param value 目标对象 */ T update(T value); }
Poolable是一个核心池。一切的manageobject都是存在这个核心池中。对于其中的T,各位不懂得看官去看看泛型基础就知道了。
好了,第二章会介绍command的具体实现,之后还会引入Dictionary类来完成字典查询。