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 中的代码实现基本上是类似的


但是BaseActivity和BaseFragment又没有共同的父类

 这个时候需要采用 组合的方式进行代码重构


/** * 因为Fragment和Activity没有共同的父类 ,但是他们各自的父类里又有一些TitleBar相同的业务逻辑处理
* 所以我创建了该类 * * @author coffee
* 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采用组合?也算是代理模式实现吧

更多相关文章

  1. Android中各种onTouch事件
  2. android 展示单选列表对话框 builder.setSingleChoiceItems
  3. Android开发实现拖动效果
  4. Android(安卓)MediaController
  5. android之实现各个组件点击事件处理
  6. Android开发实现拖动效果
  7. android的init.rc文件的语法
  8. Android(安卓)融云SDK 集成
  9. Android之辅助服务下篇————AccessibilityServic源码分析

随机推荐

  1. Android 布局 优先显示右侧的控件
  2. Android studio3 报错module not specifi
  3. 从源码中查看当前android版本
  4. Android ndk开发之在c文件里打印log
  5. Android学习札记48:将TextView中的指定文
  6. Android ViewPager中嵌套Banner 导致水平
  7. Android服务器端开发
  8. Android 如何在Java代码中手动设置控件的
  9. Android 自动换行流式布局的RadioGroup
  10. android view相对于根布局的坐标获取