Android:选项卡和搜索栏

Android: Tabs and searchbars

我有两个标签,每个标签都有自己的搜索栏。

我在 onCreateOptionsMenu 中绑定了搜索栏。但是,搜索栏只有在我离开屏幕一次并 return 到屏幕时才有效(这意味着搜索栏需要一个生命周期才能做出反应)。我确认在创建 ViewPagerFragment 时 onCreateOptionsMenu 确实被调用了两次。

我是这样绑定的:

MenuItem searchItem = menu.findItem(R.id.search);
searchItem.setVisible(true);

SearchView searchView = (SearchView) searchItem.getActionView();
searchView.setImeOptions(EditorInfo.IME_ACTION_DONE);

searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
   @Override
    public boolean onQueryTextSubmit(String query) {
          ...
          return false;
     }

     @Override
     public boolean onQueryTextChange(String newText) {
           ...
          return false;
     }
});

我猜这个错误与选项卡有关。如何实现带标签的工作搜索栏(即 viewpager2)?


我在 onCreateOptionsMenu 上调用它:

public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    // Call the above...
}

托管它们的 ViewPager 如下所示:

private void init(View view) {
    ViewPager2 viewPager2 = view.findViewById(R.id.view_pager_fragment_view_pager);
    TabLayout tabLayout = view.findViewById(R.id.tab_layout_fragment_view_pager);
    viewPager2.setUserInputEnabled(true);

    viewPager2.setAdapter(new ViewPagerFragmentAdapter(ViewPagerFragment.this));
    viewPager2.setOffscreenPageLimit(5);

    new TabLayoutMediator
            (tabLayout, viewPager2,
                    (tab, position) -> tab.setText(titles[position])).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 通过使用应用程序 Activity.
  • 中的 menu.xml 文件进行了膨胀
  • SearchView.OnQueryTextListener 由每个需要访问 SearchView
  • Fragment 实施
  • 因为每次创建 Fragment 或随后进入视图(例如滑动)时都会调用 onCreateOptionsMenu()SearchViewOnQueryTextListener更新为对应的Fragment
  • 最后,OP 的主要 Fragment 中有一行包含 ViewPager2,已删除:viewPager2.setOffscreenPageLimit(5); 导致 [=24] 提供的每个 Fragment =] 以在每次创建 Fragment 时实例化和变异 SearchViewOnQueryTextListener。 删除该行确保只有在视图中的 Fragment 绑定到 ToolbarSearchView.

如果需要更多代码,我很乐意 post 我有什么,如果我想出一个使用 viewPager2.setOffscreenPageLimit(5); 的解决方案,即缓存,我会 post 那也是