android - 如何为 SearchView 投射 CustomEditText 而不是 EditText?
问题描述
我想像我们所做的那样将内部SearchView.SearchAutoComplete
转换为CustomEditText
这样的代码EditText
;
SearchView searchView =(SearchView) search_menu.findItem(R.id.action_filter_search).getActionView();
EditText edtSearch = ((EditText) searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text));
我想自定义它的背景等等,所以问题是我如何才能转换为 a CustomEditText
?提前致谢。
解决方案
当您查看 的源代码时SearchView
,您会承认默认输入视图正在膨胀到R.id.search_src_text
这是膨胀功能:
final int layoutResId = a.getResourceId(
R.styleable.SearchView_layout, R.layout.search_view);
这是布局:R.layout.search_view
因此,要回答您的问题,无法自定义EditText
并使用该功能找到它:findViewById(android.support.v7.appcompat.R.id.search_src_text));
因为系统无法将 EditText 的实例映射到已经与另一个 view 粘在一起的 id。
为了自定义SearchAutoComplete
,SearchView
我建议 4 种方法来实现它:
- 使用Reflection或Transform API来编辑 SeachView 的默认实现,这可能既耗时又难做。
- Android 提供Search Dialog来帮助您实现许多功能,例如语音搜索或建议
- 直接自定义
SearchView
,而不是CustomEditText
- 我认为
SearchView$SearchAutoComplete
有SearchView
一个很好的实现。它提供了很多事件回调来覆盖用例。正如你提到的问题,改变背景或其他东西可能没什么大不了的。只需获取视图并对其进行编辑。
推荐阅读
- spring - Spring security,相同的配置文件但不同的根路径
- javascript - 如何在Javascript中每24小时将变量重置为0?
- python - 在后台运行另一个python程序
- sql - SQL - 当没有大小写匹配时,什么情况下不应该检查结果?
- c++ - gst_parse_launch() 抛出“断言失败”
- php - PHP:关闭与客户端的连接而不缓冲
- powershell - putty中隧道设置的脚本
- go - Golang rpc 得到错误的结构变量
- python - 用 Python 抓取网页
- usb - 使用 Intel 的 xHC 启用插槽命令后,如何确定哪个 Root Hub 端口连接了 USB 设备?