欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

解决Android SearchView不显示搜索icon的问题

程序员文章站 2023-11-18 16:40:46
背景: 之前碰到了一个页面展示问题,searchview放在toolbar里面,展示在页面顶部,发现进入这个页面后,左上角是箭头图标(表示点击返回),中间区域就是搜索栏,...

背景:

之前碰到了一个页面展示问题,searchview放在toolbar里面,展示在页面顶部,发现进入这个页面后,左上角是箭头图标(表示点击返回),中间区域就是搜索栏,不过看到会显示搜索icon????感觉额外丑陋,就想要把它隐藏掉,找了一圈没有找到如何隐藏android中android.support.v7.widget.searchview的icon,只好自己慢慢研究,手动调试观察效果了。

解决办法:

经过一段时间的调试,得出了结论,先给出方案。

final imageview searchicon = (imageview) msearchview.findviewbyid(android.support.v7.appcompat.r.id.search_mag_icon);
msearchview.post(new runnable() {
  @override
  public void run() {
    searchicon.setimagedrawable(null);
    searchicon.setvisibility(view.gone);
  }
});

接着从android.support.v7.widget.searchview的源码中,找找原因。

private void updateviewsvisibility(final boolean collapsed) {
  miconified = collapsed;
  // visibility of views that are visible when collapsed
  final int viscollapsed = collapsed ? visible : gone;
  // is there text in the query
  final boolean hastext = !textutils.isempty(msearchsrctextview.gettext());
 
  msearchbutton.setvisibility(viscollapsed);
  updatesubmitbutton(hastext);
  msearcheditframe.setvisibility(collapsed ? gone : visible);
 
  final int iconvisibility;
  if (mcollapsedicon.getdrawable() == null || miconifiedbydefault) {
    iconvisibility = gone;
  } else {
    iconvisibility = visible;
  }
  mcollapsedicon.setvisibility(iconvisibility);
 
  updateclosebutton();
  updatevoicebutton(!hastext);
  updatesubmitarea();
}

updateviewsvisibility()方法很关键,会被执行多次,这个方法就决定了mcollapsedicon是否显示隐藏,通过分析,得出需要将mcollapsedicon对应的drawable设置为null,mcollapsedicon.setvisibility(iconvisibility)才会隐藏搜索图标。代码比较简单,主要是要有意识的去翻看源码,看看内部实现。

mcollapsedicon = findviewbyid(r.id.search_mag_icon);

还可以找到searchview对应的xml布局文件,路径是appcompat-v7/res/layout/abc_search_view.xml

到此问题完美解决。

遗留一个小问题,如果要更换searchview的closebtn(类似clearedittext的清空内容的图标)对应的图片资源呢?咱们留到下一篇讲解。

总结

以上所述是小编给大家介绍的解决android searchview不显示搜索icon的问题 ,希望对大家有所帮助