返回介绍

1.3 构造方法和自定义

发布于 2024-12-23 21:07:34 字数 1800 浏览 0 评论 0 收藏 0

接下来看构造方法 public SearchView(Context context, AttributeSet attrs, int defStyleAttr) , v7SearchView 并不是用 TypedArray 而是使用 TintTypedArray ,看了源码发现 TintTypedArray 里有个: private final TypedArray mWrapped; 所以主要还是 TypedArray ,不同点是 getDrawable(int index) 和新加的 getDrawableIfKnown(int index) 方法, 并在满足条件下会调用 AppCompatDrawableManager.get().getDrawable(mContext, resourceId)

为了能更好的自定义, SearchView 的 layout 也是可以指定的,不过自定义的 layout 必须包括上面那些控件,同时 id 也是指定的, 不然后面会报错,因为 findViewById(id) 无法找到各自控件,然后调用控件方法的时候就。。。

构造方法最后是更新控件状态, mIconifiedByDefault 默认是 true 的, setIconifiedByDefault(boolean iconified) 改变值后也会执行如下方法:

  public void setIconifiedByDefault(boolean iconified) {
    if (mIconifiedByDefault == iconified) return;
    mIconifiedByDefault = iconified;
    //更新组件
    updateViewsVisibility(iconified);
    updateQueryHint();
  }

所以 setIconifiedByDefault(false) 会让 SearchView 一直呈现展开状态,并且输入框内 icon 也会不显示。具体方法如下,该方法在 updateQueryHint() 中被调用:

  private CharSequence getDecoratedHint(CharSequence hintText) {
    //如果 mIconifiedByDefault 为 false 或者 mSearchHintIcon 为 null
    //将不会添加搜索 icon 到提示 hint 中
    if (!mIconifiedByDefault || mSearchHintIcon == null) {
      return hintText;
    }

    final int textSize = (int) (mSearchSrcTextView.getTextSize() * 1.25);
    mSearchHintIcon.setBounds(0, 0, textSize, textSize);

    final SpannableStringBuilder ssb = new SpannableStringBuilder("   ");
    ssb.setSpan(new ImageSpan(mSearchHintIcon), 1, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    ssb.append(hintText);
    return ssb;
  }

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

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

发布评论

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