Android进阶:动态修改android内置搜索对话框(浮动搜索)的Icon

上次写的是构建Android内置浮动搜索框的配置,当然很简单了,就是麻烦点而已 在我写demo的过程中我发现一个问题 上次有提到

 


其中有个 android:icon="@drawable/menu_route" 本来以为可以设置 就搜索Text前面那个View的 后来发现不起作用,而且文档中都没提到这个属性 看来确实没用啊 因为这属性我可折腾好久


 

效果如图

 

就是这个了,看了SDK的文档发现确实这里没有提供修改图标的配置,那如果这里有需求要改的情况怎么办呢,所以研究了下源码 终于解决了

 

仔细看中间输入框两边的那个图标就可以看到 左边那个就是Application的Icon 是个ImageView , 右边那个是固定的 是个Button

 

这个配置就在 /res/layout/search_bar.xml 文件中 可以自己看一下布局 如下:

 

 


可以看到Google还专门给订制了一款搜索框呢 android.app.SearchDialog$SearchAutoComplete 都不带用 AutoCompleteTextView 的

 

上面就是这个搜索框的布局文件 那显示的其实就是 SearchDialog 在android.app包里的 刚开始在2.1里还没见到这个类呢 不知道咋回事

 

我们调用搜索框的方法是 通过onSearchRequested ()来调用Acitvity的startSearch()

 

而在Acitivity中我们可以看到一个变量mSearchManager 真正调用的就是它的方法startSearch()

 

这样我们就了解了这个搜索框整个的调用过程了

 

在我的应用中:

 

MapActivity--》Acitvity--》SearchManager--》SearchDialog

 

这样就清晰了 下面就可以进行操作了 然而这些类中的全局变量是private 的 而且没有提供set方法 这样我们就不能直接访问变量进行修改了,那只有一个方法了 就是反射

 

首先看代码: 在调用startSearch()方法显示搜索框之后

 

 

这里首先在当前对象Acitivity中 拿到私有变量 mSearchManager  的对象 然后通过它拿到私有变量 mSearchDialog 的SearchDialog的对象,最后拿到SearchDialog中的私有变量mAppIcon 这个ImageView 那当然就可以随便对他进行修改了

 

上面这个是更改搜索框左边那个Icon的方法 右边的那个同理也是可以修改的 只不过它是Button而已

 

 

这样就修改完成了 下面来看看效果:

 

 

都修改完成了。。当然图片大小可能不合适就先将就吧 demo而已

 

最后总结一下  我们开发中的大多数控件android都是提供的 但是难免会有需求想修改一些地方 文字大小样式 图片位置 icon等的一些修改 一般也都是比较小的修改 但是虽然是小修改可以google可不给我们机会 这种情况下要么照着葫芦画瓢重写一个,但这样就得花费比较长的时间了,我们还可以用java的工具反射来搞呢,这样简单而且有效啊

 

PS:不得不说反射真是实用啊,以前框架里经常会用到,现在也是有用武之地啊,就是geiliable

 

 

 

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值