BaseFragment的TitleBar封装如下

    1. public class BaseFragment extends Fragment {
    2. @Override
    3. public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    4. Log.d("fragment:onCreateView", getView());
    5. return null;
    6. }
    7. @Override
    8. public void onViewCreated(View view, Bundle savedInstanceState) {
    9. super.onViewCreated(view, savedInstanceState);
    10. Log.d("fragment:onCreateView", getView());
    11. findViewById();
    12. }
    13. private ViewSwitcher[] titleSwitcher;
    14. /**
    15. * 初始化View
    16. */
    17. protected void findViewById() {
    18. titleSwitcher = new ViewSwitcher[3];
    19. titleSwitcher[0] = (ViewSwitcher) findViewById(R.id.app_title_left_switcher);
    20. titleSwitcher[1] = (ViewSwitcher) findViewById(R.id.app_title_middle_switcher);
    21. titleSwitcher[2] = (ViewSwitcher) findViewById(R.id.app_title_right_switcher);
    22. }
    23. protected void setTitle(TitleRes leftTitle, TitleRes middleTitle, TitleRes rightTitle) {
    24. TitleRes[] reses = new TitleRes[] { leftTitle, middleTitle, rightTitle };
    25. for (int i = 0; i < reses.length; i++) {
    26. TitleRes res = reses[i];
    27. ViewSwitcher switcher = titleSwitcher[i];
    28. if (res == null) {
    29. switcher.setVisibility(View.INVISIBLE);
    30. } else {
    31. switcher.setVisibility(View.VISIBLE);
    32. // 触发单击事件的View
    33. View clickView = null;
    34. // 文字
    35. if (res.getType() == 0) {
    36. switcher.setDisplayedChild(0);// 显示TextView
    37. //
    38. Object resource = res.getResource();
    39. String title = resource instanceof Integer ? getResources().getString((Integer) resource) : String.valueOf(resource);
    40. ((TextView) switcher.getChildAt(0)).setText(title);
    41. clickView = switcher.getChildAt(0);
    42. } else {
    43. switcher.setDisplayedChild(1);// 显示ImageView
    44. //
    45. int imageResource = (Integer) res.getResource();
    46. ((ImageView) switcher.getChildAt(1)).setImageResource(imageResource);
    47. clickView = switcher.getChildAt(1);
    48. }
    49. // 设置title的单击事件
    50. clickView.setOnClickListener(res.getClickListener());
    51. }
    52. }
    53. }
    54. protected View findViewById(int id) {
    55. return getView().findViewById(id);
    56. }
    57. }

    子类调用

    1. public class HomeFragment extends BaseFragment implements View.OnClickListener {
    2. @Override
    3. public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    4. View layout = inflater.inflate(R.layout.home, container, false);
    5. super.onCreateView(inflater, container, savedInstanceState);
    6. return layout;
    7. }
    8. @Override
    9. public void onViewCreated(View view, Bundle savedInstanceState) {
    10. super.onViewCreated(view, savedInstanceState);
    11. findViewById(R.id.home_title_sample).setOnClickListener(this);
    12. TitleRes left = null;
    13. TitleRes middle = new TitleRes("首页标题");
    14. TitleRes right = null;
    15. setTitle(left, middle, right);
    16. }

    可以发现跟BaseActivity 中的代码实现基本上是类似的

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

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

    1. /**
    2. * 因为Fragment和Activity没有共同的父类 ,但是他们各自的父类里又有一些TitleBar相同的业务逻辑处理<br>
    3. * 所以我创建了该类
    4. *
    5. * @author coffee <br>
    6. * 2015-12-24 下午10:26:10
    7. */
    8. public class TitleMgr {
    9. /**
    10. * TitleBar的上下文
    11. */
    12. private Context context;
    13. /**
    14. * TitleBar所在的顶层View容易
    15. */
    16. private View contentView;
    17. /**
    18. * 三个Title
    19. */
    20. private ViewSwitcher[] titleSwitcher;
    21. public TitleMgr(Context context, View contenView) {
    22. this.context = context;
    23. this.contentView = contenView;
    24. }
    25. private Resources getResources() {
    26. return context.getResources();
    27. }
    28. private View findViewById(int id) {
    29. return contentView.findViewById(id);
    30. }
    31. /**
    32. * 初始化title bar
    33. */
    34. public void findViewById() {
    35. titleSwitcher = new ViewSwitcher[3];
    36. titleSwitcher[0] = (ViewSwitcher) findViewById(R.id.app_title_left_switcher);
    37. titleSwitcher[1] = (ViewSwitcher) findViewById(R.id.app_title_middle_switcher);
    38. titleSwitcher[2] = (ViewSwitcher) findViewById(R.id.app_title_right_switcher);
    39. }
    40. public void setTitle(TitleRes leftTitle, TitleRes middleTitle, TitleRes rightTitle) {
    41. TitleRes[] reses = new TitleRes[] { leftTitle, middleTitle, rightTitle };
    42. for (int i = 0; i < reses.length; i++) {
    43. TitleRes res = reses[i];
    44. ViewSwitcher switcher = titleSwitcher[i];
    45. if (res == null) {
    46. switcher.setVisibility(View.INVISIBLE);
    47. } else {
    48. switcher.setVisibility(View.VISIBLE);
    49. // 触发单击事件的View
    50. View clickView = null;
    51. // 文字
    52. if (res.getType() == 0) {
    53. switcher.setDisplayedChild(0);// 显示TextView
    54. //
    55. Object resource = res.getResource();
    56. String title = resource instanceof Integer ? getResources().getString((Integer) resource) : String.valueOf(resource);
    57. ((TextView) switcher.getChildAt(0)).setText(title);
    58. clickView = switcher.getChildAt(0);
    59. } else {
    60. switcher.setDisplayedChild(1);// 显示ImageView
    61. //
    62. int imageResource = (Integer) res.getResource();
    63. ((ImageView) switcher.getChildAt(1)).setImageResource(imageResource);
    64. clickView = switcher.getChildAt(1);
    65. }
    66. // 设置title的单击事件
    67. clickView.setOnClickListener(res.getClickListener());
    68. }
    69. }
    70. }
    71. }
    1. public class BaseFragment extends Fragment {
    2. private TitleMgr titleMgr;
    3. @Override
    4. public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    5. Log.d("fragment:onCreateView", getView());
    6. return null;
    7. }
    8. @Override
    9. public void onViewCreated(View view, Bundle savedInstanceState) {
    10. super.onViewCreated(view, savedInstanceState);
    11. Log.d("fragment:onCreateView", getView());
    12. //
    13. titleMgr = new TitleMgr(getActivity(), getView());
    14. titleMgr.findViewById();
    15. }
    16. protected void setTitle(TitleRes leftTitle, TitleRes middleTitle, TitleRes rightTitle) {
    17. titleMgr.setTitle(leftTitle, middleTitle, rightTitle);
    18. }
    1. public abstract class BaseActivity extends Activity {
    2. private TitleMgr titleMgr;
    3. @Override
    4. protected void onCreate(Bundle savedInstanceState) {
    5. super.onCreate(savedInstanceState);
    6. ActivityMgr.push(this);
    7. findViewById();
    8. }
    9. /**
    10. * 初始化View
    11. */
    12. protected void findViewById() {
    13. titleMgr = new TitleMgr(getContext(), findViewById(android.R.id.content));
    14. titleMgr.findViewById();
    15. }
    16. protected void setTitle(TitleRes leftTitle, TitleRes middleTitle, TitleRes rightTitle) {
    17. titleMgr.setTitle(leftTitle, middleTitle, rightTitle);
    18. }

    我把业务逻辑抽出来放在单独写好的TitleMgr类中,然后BaseActivity和BaseFragment采用组合?也算是代理模式实现吧