Java Android:标签和搜索栏
我有两个选项卡,每个选项卡都有自己的搜索栏 我将搜索栏绑定到创建选项菜单中的Java Android:标签和搜索栏,java,android,tabs,android-lifecycle,android-search,Java,Android,Tabs,Android Lifecycle,Android Search,我有两个选项卡,每个选项卡都有自己的搜索栏 我将搜索栏绑定到创建选项菜单中的oncreateoptions。但是,只有当我离开屏幕一次并返回屏幕时,搜索栏才起作用(这意味着搜索栏还需要一个生命周期才能做出反应)。我确认,在创建ViewPagerFragment时,OnCreateOptions菜单确实被调用了两次 我把它们捆成这样: MenuItem searchItem=menu.findItem(R.id.search); searchItem.setVisible(true); Searc
oncreateoptions
。但是,只有当我离开屏幕一次并返回屏幕时,搜索栏才起作用(这意味着搜索栏还需要一个生命周期才能做出反应)。我确认,在创建ViewPagerFragment时,OnCreateOptions菜单确实被调用了两次
我把它们捆成这样:
MenuItem searchItem=menu.findItem(R.id.search);
searchItem.setVisible(true);
SearchView SearchView=(SearchView)searchItem.getActionView();
searchView.setImeOptions(EditorInfo.IME\u ACTION\u DONE);
searchView.setOnQueryTextListener(新的searchView.OnQueryTextListener(){
@凌驾
公共布尔值onQueryTextSubmit(字符串查询){
...
返回false;
}
@凌驾
公共布尔onQueryTextChange(字符串newText){
...
返回false;
}
});
我猜这个bug与标签有关。如何实现带选项卡的工作搜索栏(即viewpager2)
我将其称为OnCreateOptions菜单:
public void onCreateOptions菜单(@NonNull菜单,@NonNull菜单充气机){
super.onCreateOptions菜单(菜单,充气机);
//打电话给上面的。。。
}
承载它们的ViewPager如下所示:
private void init(视图){
ViewPager2 ViewPager2=view.findViewById(R.id.view\u pager\u fragment\u view\u pager);
TabLayout TabLayout=view.findViewById(R.id.tab\u布局\u片段\u视图\u页面);
viewPager2.setUserInputened(true);
setAdapter(新的ViewPagerFragmentAdapter(ViewPagerFragment.this));
viewPager2.setOffscreenPageLimit(5);
新的TabLayoutMediator
(TableLayout,viewPager2,
(制表符,位置)->tab.setText(标题[位置]).attach();
}
OP和我在寻找解决方案时进行了沟通
首先,将每个片段更改为
public class MergedItemsFragment extends Fragment implements SearchView.OnQueryTextListener {
/// ------------------------------
/// SearchView.OnQueryTextListener
@Override
public boolean onQueryTextSubmit(String query) {
// ...
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
// ...
return false;
}
/// --------
/// Fragment
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_merged_items, container, false);
}
@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
final MenuItem searchItem = menu.findItem(R.id.search);
final SearchView searchView = (SearchView) searchItem.getActionView();
searchView.setImeOptions(EditorInfo.IME_ACTION_DONE);
searchView.setOnQueryTextListener(this);
}
}
通过在应用程序的活动中使用menu.xml文件而膨胀SearchView
由需要访问SearchView.OnQueryTextListener
SearchView
- 因为每次创建
片段或随后进入视图时(例如,滑动)都会调用
;onCreateOptions菜单()
的SearchView
更新为相应的OnQueryTextListener
片段
- 最后,OP的主
中有一行包含被删除的片段
:ViewPager2
ViewPager2.setOffscreenPageLimit(5)代码>导致
提供的每个FragmentStateAdapter
在每次创建片段
时实例化和变异片段
的SearchView
。 删除该行确保只有视图中的OnQueryTextListener
绑定到片段
的工具栏
搜索视图
如果需要更多的代码,我很乐意发布我所拥有的,如果我使用
viewPager2.setOffscreenPageLimit(5)提出解决方案代码>即缓存,我也会发布这篇文章听起来你的问题来自你的搜索视图
你用这种方式做过一些研究吗?似乎这个问题与调用(创建)菜单的两个片段有关。在这种情况下,您应该使用活动来扩展菜单并绑定搜索栏,并基于当前页面(片段),将事件分派到该片段。我认为我无法做到这一点,我在每个片段中调用OnCreateOptions菜单中以前的所有方法-请参阅我更新的问题。@Froyo我在帖子中添加了更多信息。也许您应该将这部分代码移动到OnPrepareOptions菜单方法,并在viewPager页面更改时调用activity的InvalidateOptions菜单()方法?