You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Google Material SearchView中实现原SearchView的WebView搜索URL逻辑?

迁移传统SearchView逻辑到Material SearchView

核心思路

Material组件的SearchBar和SearchView是分离式控件,需要先关联两者的交互逻辑,再给SearchView绑定查询提交监听,就能复用原有WebView加载URL的逻辑。

步骤与代码实现

1. 在Activity中初始化控件

先在onCreate方法里获取布局中的SearchBar、SearchView以及你的WebView实例:

private SearchBar searchBar;
private SearchView searchView;
private WebView webView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.your_activity_layout); // 替换成你的布局文件名
    
    // 初始化控件
    searchBar = findViewById(R.id.searchBar);
    searchView = findViewById(R.id.search);
    webView = findViewById(R.id.your_webview_id); // 替换成你的WebView ID
    
    // 点击SearchBar展开搜索框
    searchBar.setNavigationOnClickListener(v -> searchView.show());
}

2. 绑定查询提交监听

给SearchView设置查询监听,实现和传统SearchView一致的提交逻辑:

@Override
protected void onCreate(Bundle savedInstanceState) {
    // ... 上面的初始化代码
    
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            // 复用原有加载搜索URL的逻辑
            webView.loadUrl("https://br-androidtech.blogspot.com/search?q=" + query);
            
            // 提交后关闭搜索框,回到SearchBar状态
            searchView.hide();
            searchBar.setText(query); // 可选:在SearchBar显示搜索关键词
            
            return true;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            // 不需要实时搜索的话直接返回false即可
            return false;
        }
    });
    
    // 可选:点击空白区域自动关闭搜索框
    searchView.getViewTreeObserver().addOnGlobalLayoutListener(() -> {
        Rect displayRect = new Rect();
        searchView.getWindowVisibleDisplayFrame(displayRect);
        int screenHeight = searchView.getRootView().getHeight();
        int keyboardHeight = screenHeight - displayRect.bottom;
        if (keyboardHeight == 0) {
            searchView.hide();
        }
    });
}

3. 清理原有代码

因为现在用布局内的SearchBar/SearchView替代了菜单式搜索,直接删除原来的onCreateOptionsMenu方法即可。

关键差异说明

  • 传统SearchView通过菜单Item获取实例,Material组件直接从布局初始化
  • 需要手动绑定SearchBar的点击事件来展开SearchView
  • 提交查询后调用searchView.hide()回到初始状态,替代原有的clearFocus()操作

内容的提问来源于stack exchange,提问作者Hendril Mendes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 11:25:43