ViewPager切换Fragment时,如何展开ActionBar的SearchView并填充查询内容?
解决ViewPager切换Fragment时自动展开SearchView并填充查询的问题
我明白你现在的需求——切换ViewPager里的Fragment时,不仅要保留SearchView的查询内容,还要自动把它展开并填入之前的查询对吧?之前你已经搞定了状态保留和搜索结果更新,就差这最后一步,我来给你几个可行的方案试试:
方案一:在Activity中全局维护SearchView引用,结合ViewPager页面切换回调
这个方案最直接,因为ActionBar的Menu属于Activity,直接在Activity里处理更高效:
全局变量保存SearchView和当前查询
在你的Activity里声明两个全局变量,用来保留SearchView实例和当前的搜索查询:private SearchView mSearchView; private String mCurrentSearchQuery = "";在onCreateOptionsMenu中初始化并监听查询变化
加载菜单时获取SearchView的引用,同时监听查询的提交和变化,实时保存当前查询:@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.your_search_menu, menu); MenuItem searchMenuItem = menu.findItem(R.id.action_search); mSearchView = (SearchView) searchMenuItem.getActionView(); // 监听查询变化,保存当前查询内容 mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { mCurrentSearchQuery = query; // 这里放你的搜索提交逻辑 return true; } @Override public boolean onQueryTextChange(String newText) { mCurrentSearchQuery = newText; // 这里放你的实时搜索逻辑 return true; } }); return true; }监听ViewPager页面切换,触发SearchView展开和填充
给ViewPager添加页面选中的监听器,在切换Fragment时主动展开SearchView并填入保存的查询:yourViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {} @Override public void onPageSelected(int position) { // 先判断SearchView和对应的MenuItem是否存在,避免空指针 if (mSearchView != null && mSearchView.getMenuItem() != null) { // 展开SearchView的ActionView mSearchView.getMenuItem().expandActionView(); // 设置查询内容,第二个参数true会触发查询(不需要的话传false) mSearchView.setQuery(mCurrentSearchQuery, true); // 可选:让SearchView获取焦点,弹出软键盘 mSearchView.requestFocus(); } } @Override public void onPageScrollStateChanged(int state) {} });
方案二:Fragment通过接口回调通知Activity操作SearchView
如果你的搜索逻辑是在Fragment里维护的,可以用接口回调让Activity来处理SearchView的展开:
定义Fragment切换的回调接口
在你的Fragment中定义一个接口,用来通知Activity切换事件:public interface FragmentSwitchCallback { void onFragmentSwitched(String currentQuery); }Activity实现回调接口
在宿主Activity中实现这个接口,在回调方法里执行SearchView的展开和填充:@Override public void onFragmentSwitched(String currentQuery) { if (mSearchView != null && mSearchView.getMenuItem() != null) { mSearchView.getMenuItem().expandActionView(); mSearchView.setQuery(currentQuery, true); mSearchView.requestFocus(); } }Fragment在切换时触发回调
利用Fragment的onResume生命周期(切换Fragment时会触发),调用回调通知Activity:@Override public void onResume() { super.onResume(); // 确保宿主Activity实现了回调接口 if (getActivity() instanceof FragmentSwitchCallback) { // 传入当前Fragment保存的查询内容 ((FragmentSwitchCallback) getActivity()).onFragmentSwitched(mFragmentSearchQuery); } }
注意事项
- 一定要加非空判断,避免SearchView还未初始化时调用方法导致崩溃;
- 如果使用的是自定义Toolbar,要确保已经通过
setSupportActionBar(toolbar)将其设置为ActionBar; - 如果不需要自动触发查询,
setQuery方法的第二个参数传false即可。
内容的提问来源于stack exchange,提问作者user6449577
相关产品推荐
相关产品推荐

