Android: вкладки и панели поиска - PullRequest
3 голосов
/ 27 февраля 2020

У меня есть две вкладки, и каждая вкладка имеет свою собственную панель поиска.

Я связываю панель поиска в onCreateOptionsMenu. Однако поисковые панели работают только в том случае, если я покидаю экран один раз и возвращаюсь к экрану (то есть для реагирования поисковых панелей требуется еще один жизненный цикл). Я подтвердил, что onCreateOptionsMenu действительно вызывается два раза во время создания ViewPagerFragment.

Я связываю их так:

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

1 Ответ

2 голосов
/ 08 марта 2020

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 с использованием меню. xml файл в Активности приложения.
  • SearchView.OnQueryTextListener был реализован каждым Fragment, которому необходим доступ к SearchView
  • , так как onCreateOptionsMenu() вызывается каждый раз, когда Fragment создан или впоследствии появляется (например, Swipe); SearchView OnQueryTextListener обновляется до соответствующего Fragment
  • Наконец, в главном OP * была строка Fragment, содержащая ViewPager2, которая была удалена: viewPager2.setOffscreenPageLimit(5);, которая вызвала каждый Fragment, предоставленный FragmentStateAdapter для создания и изменения SearchView OnQueryTextListener каждый раз при создании Fragment. Удаление строки убедилось, что только Fragment, который был виден, был привязан к Toolbar s SearchView.

Если какой-либо дополнительный код желателен, я был бы рад опубликуйте то, что у меня есть, и если я придумаю решение, использующее viewPager2.setOffscreenPageLimit(5); т.е. кеширование, я также опубликую это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...