Я, должно быть, что-то делаю не так или что-то упускаю в процессе. Но если я использую дочерний (вложенный) фрагмент с поиском, фильтр предыдущего и следующего фрагментов не будет работать. Вот сценарий:
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) поиска работают как положено, если нет вложенных (дочерних) фрагментов.
Заранее спасибо за просмотр этого длинного нить.