上次写的是构建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