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

 

 

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
以下是在Android Studio中实现单选对话框确认后在底部浮动显示该选项内容用Toast的示例代码: 1. 在布局文件中添加一个TextView用于显示选项内容: ``` <TextView android:id="@+id/selected_option" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="Selected option will be displayed here" android:textSize="18sp" /> ``` 2. 在Activity中定义一个数组用于存储选项列表,以及一个整型变量用于存储选中的位置: ``` private String[] options = {"Option 1", "Option 2", "Option 3", "Option 4"}; private int selectedPosition = -1; ``` 3. 在Activity中创建一个AlertDialog.Builder对象用于显示单选对话框: ``` AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Select an option"); builder.setSingleChoiceItems(options, selectedPosition, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { selectedPosition = which; } }); builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if (selectedPosition != -1) { String selectedOption = options[selectedPosition]; Toast.makeText(MainActivity.this, selectedOption + " selected", Toast.LENGTH_SHORT).show(); TextView selectedOptionTextView = findViewById(R.id.selected_option); selectedOptionTextView.setText(selectedOption); } } }); builder.setNegativeButton("Cancel", null); AlertDialog dialog = builder.create(); dialog.show(); ``` 4. 在点击确认按钮时,获取选中的选项内容并显示在TextView中,并使用Toast在底部浮动显示选项内容。 这样,当用户选择一个选项并点击确认后,该选项的内容将显示在TextView中,并在底部浮动显示选项内容的Toast。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值