Android中menu配置的androidx SearchView调用setQuery等接口无响应如何解决
核心失效原因
- Fragment未开启菜单回调权限,自定义Toolbar未绑定为ActionBar导致菜单配置未正确加载
setSearchableInfo调用在setQueryHint之后,SearchableInfo的空提示会覆盖手动设置的提示文本setIconified系列方法展开搜索框可靠性低,应优先使用MenuItem的展开方法
具体修复步骤
- 第一步:在Fragment的
onViewCreated方法中绑定自定义Toolbar并开启菜单回调权限@Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); Toolbar myToolbar = view.findViewById(R.id.myToolbar); AppCompatActivity activity = (AppCompatActivity) getActivity(); // 将自定义Toolbar绑定为Activity的ActionBar activity.setSupportActionBar(myToolbar); // 允许Fragment接收菜单创建回调 setHasOptionsMenu(true); } - 第二步:调整
onCreateOptionsMenu的代码执行顺序,添加兜底方案设置提示文本,使用更可靠的方式展开搜索框@Override public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { // super调用放在最前面 super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.search_menu, menu); MenuItem searchItem = menu.findItem(R.id.action_search); final SearchView searchView = (SearchView) searchItem.getActionView(); // 先设置SearchableInfo,避免后续配置被覆盖 SearchManager searchManager=(SearchManager) getActivity().getSystemService(Context.SEARCH_SERVICE); searchView.setSearchableInfo(searchManager.getSearchableInfo(getActivity().getComponentName())); // 再设置提示文本 searchView.setQueryHint("Xavier search for stuff"); // 兜底方案:直接获取SearchView内部的EditText控件设置提示,100%生效 EditText searchEditText = searchView.findViewById(androidx.appcompat.R.id.search_src_text); searchEditText.setHint("Xavier search for stuff"); // 用MenuItem的方法展开搜索框,比setIconified更可靠 searchItem.expandActionView(); searchView.setIconifiedByDefault(false); searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String s) { return false; } @Override public boolean onQueryTextChange(String s) { return false; } }); }
内容的提问来源于stack exchange,提问作者mike
相关产品推荐
相关产品推荐

