返回介绍

TitleBar 封装(二)

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

这一篇讲述一下 TitleBar 怎么增加交互

BaseActivity 中的逻辑实现

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());
      }
    }
  }

自雷 TitleSampleActivity 调用如下

@Override
  protected void findViewById() {
    setContentView(R.layout.title_demo);
    super.findViewById();

    // setTitle("返回主页", "这是一个 Title", "下一个界面");
    TitleRes left = new TitleRes("left", new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        Toast.makeText(TitleDemoActivity.this, "click left", Toast.LENGTH_SHORT).show();
        //showToast("click left");
      }
    });
    TitleRes middle = new TitleRes("middle", new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        Toast.makeText(TitleDemoActivity.this, "click middle", Toast.LENGTH_SHORT).show();
        //showToast("click middle");
      }
    });
    TitleRes right = new TitleRes("right", new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        Toast.makeText(TitleDemoActivity.this, "click right", Toast.LENGTH_SHORT).show();
        //showToast("click right");
      }
    });
    //
    setTitle(left, middle, right);
  }

这个时候 title 三个控件都具备了交互的能力

Toast.makeText(TitleDemoActivity.this,"click right",Toast. LENGTH_SHORT ).show();

程序中会频繁的用到 context Toast 等对象

采用 Class.this 的方式在代码移植、维护、重构等方面很不友好

另外频繁调用 Toast 每次都那么写的话 麻烦死

所以 BaseActivity 中新增俩方法

作用于暂且定义为 protected 以后估计还得改


protected Context getContext() {

  returnthis;

}
protectedvoid showToast(String message) {

  Toast.*makeText*(getContext(), message,Toast.*LENGTH_SHORT*).show();

}

这个时候子类调用父类的代码如下

TitleRes left =newTitleRes("left",newView.OnClickListener() {

  @Override

  publicvoid onClick(View v) {

    showToast("click left");//

  }

});

。。。。中、右略

//

setTitle(left,middle, right);

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

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

发布评论

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