Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android:标签和搜索栏_Java_Android_Tabs_Android Lifecycle_Android Search - Fatal编程技术网

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);

    }

}

  • SearchView
    通过在应用程序的活动中使用menu.xml文件而膨胀
  • SearchView.OnQueryTextListener
    由需要访问
    SearchView
  • 因为每次创建
    片段或随后进入视图时(例如,滑动)都会调用
    onCreateOptions菜单()
    SearchView
    OnQueryTextListener
    更新为相应的
    片段
  • 最后,OP的主
    片段
    中有一行包含被删除的
    ViewPager2
    ViewPager2.setOffscreenPageLimit(5)导致
    FragmentStateAdapter
    提供的每个
    片段
    在每次创建
    片段
    时实例化和变异
    SearchView
    OnQueryTextListener
    。 删除该行确保只有视图中的
    片段
    绑定到
    工具栏
    搜索视图

如果需要更多的代码,我很乐意发布我所拥有的,如果我使用
viewPager2.setOffscreenPageLimit(5)提出解决方案即缓存,我也会发布这篇文章

听起来你的问题来自你的
搜索视图
你用这种方式做过一些研究吗?似乎这个问题与调用(创建)菜单的两个片段有关。在这种情况下,您应该使用活动来扩展菜单并绑定搜索栏,并基于当前页面(片段),将事件分派到该片段。我认为我无法做到这一点,我在每个片段中调用OnCreateOptions菜单中以前的所有方法-请参阅我更新的问题。@Froyo我在帖子中添加了更多信息。也许您应该将这部分代码移动到OnPrepareOptions菜单方法,并在viewPager页面更改时调用activity的InvalidateOptions菜单()方法?