SearchView во вложенных фрагментах не работает должным образом - PullRequest
0 голосов
/ 16 апреля 2020

Я, должно быть, что-то делаю не так или что-то упускаю в процессе. Но если я использую дочерний (вложенный) фрагмент с поиском, фильтр предыдущего и следующего фрагментов не будет работать. Вот сценарий:

Fragment1  
Fragment2  
Fragment3  
  Fragment3-1  
  Fragment3-2  
Fragment4  
Fragment5  

У меня есть вид поиска во Fragment2, Fragment3-1, Fragment3-2 и Fragment4. Используется menu.clear() для удаления дублирующихся видов. setHasOptionsMenu(true); устанавливается во фрагментах.

onCreateOptionsMenu Fragment2

@Override
    public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {

        menu.clear();
        inflater.inflate(R.menu.search_menu, menu);
        inflater.inflate(R.menu._dotted_menu, menu);
        super.onCreateOptionsMenu(menu, inflater);

        MenuItem searchItem = menu.findItem(R.id.action_search);
        androidx.appcompat.widget.SearchView searchView1 = (androidx.appcompat.widget.SearchView) searchItem.getActionView();
        searchView1.setImeOptions(EditorInfo.IME_ACTION_DONE);

        searchView1.setOnQueryTextListener(new androidx.appcompat.widget.SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                if(mRecyclerView.getAdapter() != null) {
                    adapter.getFilter().filter(newText);
                }
                return false;
            }
        });

    }

search_menu. xml

<?xml version="1.0" encoding="utf-8"?>
<menu
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/action_search"
        android:icon="@drawable/ic_search"
        android:title="@string/search"
        app:actionViewClass="androidx.appcompat.widget.SearchView"
        app:showAsAction="ifRoom|collapseActionView" />

</menu>

ViewPager во фрагменте 3

SectionsPagerAdapter mSectionsPagerAdapter = new Fragment3.SectionsPagerAdapter(getChildFragmentManager());
ViewPager mViewPager = v.findViewById(R.id.container);

PagerAdapter во фрагменте 3

public static class SectionsPagerAdapter extends FragmentPagerAdapter {

        SectionsPagerAdapter(FragmentManager fm) {
            super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
        }

        @NonNull
        @Override
        public Fragment getItem(int position) {

            Fragment fragment = null;
            switch (position) {
                case 0: 
                    fragment = new Fragment31();
                    break;
                case 1: 
                    fragment = new Fragment32();
                    break;
            }
            assert fragment != null;
            return fragment;
        }

        @Override
        public int getCount() {
            return 2;
        }

    }

onCreateOptionsMenu вложенный фрагмент 3-1 (то же самое для Fragment3-2)

@Override
    public void onCreateOptionsMenu(@NonNull Menu menu1, @NonNull MenuInflater inflater) {

        menu1.clear();
        inflater.inflate(R.menu.search_menu, menu1);
        inflater.inflate(R.menu._dotted_menu, menu1);
        super.onCreateOptionsMenu(menu1, inflater);

        MenuItem searchItem = menu1.findItem(R.id.action_search);
        androidx.appcompat.widget.SearchView searchView = (androidx.appcompat.widget.SearchView) searchItem.getActionView();
        searchView.setImeOptions(EditorInfo.IME_ACTION_DONE);

        searchView.setOnQueryTextListener(new androidx.appcompat.widget.SearchView.OnQueryTextListener() {

            @Override
            public boolean onQueryTextSubmit(String query1) {

                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText1) {

                fastItemAdapter.filter(newText1);
                return true;
            }

        });

        endlessRecyclerOnScrollListener.enable();

    }

TabLayout для Fragment3

<com.google.android.material.appbar.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <com.google.android.material.tabs.TabLayout
            android:id="@+id/tabs"
            app:tabMode="fixed"
            app:tabTextAppearance="@style/customTabLayout"
            android:layout_width="match_parent"
            android:background="?attr/primaryBackgroundColor"
            app:tabTextColor="?attr/primaryTextColor"
            android:layout_height="wrap_content">

            <com.google.android.material.tabs.TabItem
                android:id="@+id/tabOpen"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/tabOpen" />

            <com.google.android.material.tabs.TabItem
                android:id="@+id/tabClosed"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/tabClosed" />

        </com.google.android.material.tabs.TabLayout>

    </com.google.android.material.appbar.AppBarLayout>

    <androidx.viewpager.widget.ViewPager
        android:id="@+id/container1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

MainActivity onCreate

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        Toolbar toolbar = findViewById(R.id.toolbar);
        TextView toolbarTitle = toolbar.findViewById(R.id.toolbar_title);

        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        SectionsPagerAdapter mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

        ViewPager mViewPager = findViewById(R.id.container);
        mViewPager.setAdapter(mSectionsPagerAdapter);

        TabLayout tabLayout = findViewById(R.id.tabs);

        mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
        tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(mViewPager));
}

Теперь, если я go в Fragment2 в окне поиска не будет фильтровать контент. Если я удаляю onCreateOptionsMenu из Fragment3-1 и 3-2, все работает нормально.

Интересно, что если я go в Fragment2, тогда другие фрагменты (3,4 et c) возвращаются во Fragment2, это делает фильтруйте содержимое правильно. То же самое происходит с Fragment4.

Все фрагменты (2,3,4) поиска работают как положено, если нет вложенных (дочерних) фрагментов.

Заранее спасибо за просмотр этого длинного нить.

...