返回介绍

TitleBar 重构 (代理模式的使用)

发布于 2025-02-25 12:45:31 字数 6886 浏览 0 评论 0 收藏 0

BaseFragment 的 TitleBar 封装如下

public class BaseFragment extends Fragment {

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    Log.d("fragment:onCreateView", getView());

    return null;
  }

  @Override
  public 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);
        // 触发单击事件的 View
        View 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 {

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View layout = inflater.inflate(R.layout.home, container, false);
    super.onCreateView(inflater, container, savedInstanceState);
    return layout;
  }

  @Override
  public 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 相同的业务逻辑处理<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);
        // 触发单击事件的 View
        View 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;

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    Log.d("fragment:onCreateView", getView());
    return null;
  }

  @Override
  public 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;

  @Override
  protected 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 采用组合?也算是代理模式实现吧

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文