Android SDK开发 -- TitleBar重构 (代理模式的使用)
来源:互联网 发布:土耳其软糖淘宝 编辑:程序博客网 时间:2024/06/07 18:23
BaseFragment的TitleBar封装如下
public class BaseFragment extends Fragment {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {Log.d("fragment:onCreateView", getView());return null;}@Overridepublic void onViewCreated(View view, Bundle savedInstanceState) {super.onViewCreated(view, savedInstanceState);Log.d("fragment:onCreateView", getView());findViewById();}private ViewSwitcher[] titleSwitcher;/** * 初始化View */protected void findViewById() {titleSwitcher = new ViewSwitcher[3];titleSwitcher[0] = (ViewSwitcher) findViewById(R.id.app_title_left_switcher);titleSwitcher[1] = (ViewSwitcher) findViewById(R.id.app_title_middle_switcher);titleSwitcher[2] = (ViewSwitcher) findViewById(R.id.app_title_right_switcher);}protected void setTitle(TitleRes leftTitle, TitleRes middleTitle, TitleRes rightTitle) {TitleRes[] reses = new TitleRes[] { leftTitle, middleTitle, rightTitle };for (int i = 0; i < reses.length; i++) {TitleRes res = reses[i];ViewSwitcher switcher = titleSwitcher[i];if (res == null) {switcher.setVisibility(View.INVISIBLE);} else {switcher.setVisibility(View.VISIBLE);// 触发单击事件的ViewView clickView = null;// 文字if (res.getType() == 0) {switcher.setDisplayedChild(0);// 显示TextView//Object resource = res.getResource();String title = resource instanceof Integer ? getResources().getString((Integer) resource) : String.valueOf(resource);((TextView) switcher.getChildAt(0)).setText(title);clickView = switcher.getChildAt(0);} else {switcher.setDisplayedChild(1);// 显示ImageView//int imageResource = (Integer) res.getResource();((ImageView) switcher.getChildAt(1)).setImageResource(imageResource);clickView = switcher.getChildAt(1);}// 设置title的单击事件clickView.setOnClickListener(res.getClickListener());}}}protected View findViewById(int id) {return getView().findViewById(id);}}
子类调用
public class HomeFragment extends BaseFragment implements View.OnClickListener {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {View layout = inflater.inflate(R.layout.home, container, false);super.onCreateView(inflater, container, savedInstanceState);return layout;}@Overridepublic void onViewCreated(View view, Bundle savedInstanceState) {super.onViewCreated(view, savedInstanceState);findViewById(R.id.home_title_sample).setOnClickListener(this);TitleRes left = null;TitleRes middle = new TitleRes("首页标题");TitleRes right = null;setTitle(left, middle, right);}
但是BaseActivity和BaseFragment又没有共同的父类
这个时候需要采用 组合的方式进行代码重构
/** * 因为Fragment和Activity没有共同的父类 ,但是他们各自的父类里又有一些TitleBar相同的业务逻辑处理<br> * 所以我创建了该类 * * @author coffee <br> * 2015-12-24 下午10:26:10 */public class TitleMgr {/** * TitleBar的上下文 */private Context context;/** * TitleBar所在的顶层View容易 */private View contentView;/** * 三个Title */private ViewSwitcher[] titleSwitcher;public TitleMgr(Context context, View contenView) {this.context = context;this.contentView = contenView;}private Resources getResources() {return context.getResources();}private View findViewById(int id) {return contentView.findViewById(id);}/** * 初始化title bar */public void findViewById() {titleSwitcher = new ViewSwitcher[3];titleSwitcher[0] = (ViewSwitcher) findViewById(R.id.app_title_left_switcher);titleSwitcher[1] = (ViewSwitcher) findViewById(R.id.app_title_middle_switcher);titleSwitcher[2] = (ViewSwitcher) findViewById(R.id.app_title_right_switcher);}public void setTitle(TitleRes leftTitle, TitleRes middleTitle, TitleRes rightTitle) {TitleRes[] reses = new TitleRes[] { leftTitle, middleTitle, rightTitle };for (int i = 0; i < reses.length; i++) {TitleRes res = reses[i];ViewSwitcher switcher = titleSwitcher[i];if (res == null) {switcher.setVisibility(View.INVISIBLE);} else {switcher.setVisibility(View.VISIBLE);// 触发单击事件的ViewView clickView = null;// 文字if (res.getType() == 0) {switcher.setDisplayedChild(0);// 显示TextView//Object resource = res.getResource();String title = resource instanceof Integer ? getResources().getString((Integer) resource) : String.valueOf(resource);((TextView) switcher.getChildAt(0)).setText(title);clickView = switcher.getChildAt(0);} else {switcher.setDisplayedChild(1);// 显示ImageView//int imageResource = (Integer) res.getResource();((ImageView) switcher.getChildAt(1)).setImageResource(imageResource);clickView = switcher.getChildAt(1);}// 设置title的单击事件clickView.setOnClickListener(res.getClickListener());}}}}
public class BaseFragment extends Fragment {private TitleMgr titleMgr;@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {Log.d("fragment:onCreateView", getView());return null;}@Overridepublic void onViewCreated(View view, Bundle savedInstanceState) {super.onViewCreated(view, savedInstanceState);Log.d("fragment:onCreateView", getView());//titleMgr = new TitleMgr(getActivity(), getView());titleMgr.findViewById();}protected void setTitle(TitleRes leftTitle, TitleRes middleTitle, TitleRes rightTitle) {titleMgr.setTitle(leftTitle, middleTitle, rightTitle);}
public abstract class BaseActivity extends Activity {private TitleMgr titleMgr;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);ActivityMgr.push(this);findViewById();}/** * 初始化View */protected void findViewById() {titleMgr = new TitleMgr(getContext(), findViewById(android.R.id.content));titleMgr.findViewById();}protected void setTitle(TitleRes leftTitle, TitleRes middleTitle, TitleRes rightTitle) {titleMgr.setTitle(leftTitle, middleTitle, rightTitle);}
我把业务逻辑抽出来放在单独写好的TitleMgr类中,然后BaseActivity和BaseFragment采用组合?也算是代理模式实现吧
0 0
- Android SDK开发 -- TitleBar重构 (代理模式的使用)
- Android SDK开发 -- TitleBar重构 (代理模式-优化)
- Android SDK开发 -- TitleBar重构 - 使用策略模式、舍弃代理模式
- android SDK开发 -- TitleBar封装(一)
- android SDK开发 -- TitleBar封装(二)
- Android开发:定制Activity的标题栏(Titlebar)
- Android开发:定制Activity的标题栏(Titlebar)
- android开发,去除TitleBar:
- Android的TitleBar设置
- Android SDK下载速度慢的解决方法(简单使用代理)
- Android SDK下载速度慢的解决方法(简单使用代理)
- Android SDK Manager的代理
- Android的Base初始化,使用代理模式
- android开发配置代理更新SDK
- 使用命令行+代理更新Android SDK---国内的Android代理镜像服务器
- Java -接口使用简述(Android自定义TitleBar)
- Android开发中常用的设计模式 --- 动态代理模式
- Android的开发之&java23中设计模式------>代理模式
- 欢迎使用CSDN-markdown编辑器
- C#序列化匿名对象为XML
- Linux进程控制
- Creating and Using a Temporary File
- 一起talk C栗子吧(第八十二回:C语言实例--简单圣诞树)
- Android SDK开发 -- TitleBar重构 (代理模式的使用)
- /etc/ld.so.conf文件
- Hdu 2037 之解题报告
- Ubuntu下为Firefox安装Adobe Flash Player
- Exception 'yii\db\Exception' with message 'SQLSTATE[HY000] [2002] No such file or directory’错误的解决方法
- 通过jquery实现页面的动画效果
- sublime text安装ctags定位函数
- Android 编程技巧之 ----- 随意从当前 Activity 退出应用
- 压测总结