Intereting Posts
Как сделать все содержимое страницы android scoll вверх Как мы можем проверить биллинговую квитанцию ​​на Android-стороне на стороне сервера? Как получить имя домашнего приложения по умолчанию для Android Невозможно ссылаться на рисоваемый PNG на Java? Как я могу обнаружить, что объект MediaPlayer начинает играть? Android: можно ли сделать снимок с камеры из службы без UI Воспроизведение видео в устройстве Android с помощью проигрывателя устройства Android: Как настроить язык поддержки веб-браузера при загрузке URL-адреса? Сделать закусочную без просмотра? ScrollBy не работает должным образом во вложенном recycliewiew Автоматическое воспроизведение видео vimeo в веб-браузере Android Res \ layout \ Contact_us.xml: Недопустимое имя файла: должно содержать только Доступ к видео и фотографиям на Android 1.5 + Proguard minifyEnabled true для сборки отладки, не работающей на pre-Lollipop Изменить цвет названия на панели инструментов?

Как использовать onQueryTextChange со многими фрагментами

У меня много фрагментов, которые показаны в двух макетах вкладок с использованием FragmentStatePagerAdapter в каждом фрагменте есть представление Recycler, и я хочу использовать панель поиска на панели приложений для фильтрации результатов.

Сначала я сделал это, используя onQueryTextChange listener в onCreateOptionsMenu, и он отлично работал с фрагментами пары, но когда я добавил реализацию к другим фрагментам (только ctrl + c и ctrl + v), он прекратил работу, никаких результатов даже на фрагменты, которые использовали Для работы я тогда прочитал здесь, что лучше было бы onQueryTextChange listener in onPrepareOptionsMenu чтобы избежать проблемы с invalidateOptionsMenu, но я решил дать эту попытку, которая также работала, а затем, когда я добавил методы ко всем остальным моим фрагментам Снова он терпит неудачу, но он работает на нескольких фрагментах, как это ни странно, все они связаны с одним и тем же родительским фрагментом, но код для 4 родительских фрагментов и для их вызова идентичен.

Другой способ, который я прочитал, – это creating an interface и использовать его из моего основного действия, получив ссылку на текущий фрагмент, но затем идентификатор должен получить отображаемый в настоящий момент фрагмент из моего viewpager, который я не знаю, может быть, кто-нибудь может взвесить В этом для меня,

Большое спасибо

И спасибо за великолепное редактирование lol

EDIT Пробовал интерфейсный подход безрезультатно, хотя я все еще новичок, мне нужно найти прикрепленный фрагмент, а с помощью framestateviewpager его просто невозможно, не используя хаки, должна быть какая-то причина, почему он работает в некоторых, а не в других, а иногда не за что

Изменить 2

Так что я все еще возился с этим, и у ive почти не было ответов, так что давайте плоть это немного, поэтому я добавлял макет меню в основное действие, подобное этому

 @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.dashboard, menu); SearchView searchView = (SearchView)menu.findItem(R.id.action_search).getActionView(); SearchManager searchManager = (SearchManager) getSystemService(SEARCH_SERVICE); searchView.setSearchableInfo(searchManager .getSearchableInfo(getComponentName())); return true; } 

А затем добавив к нему слушателя из фрагмента в onPrepareOptionsMenu, как это

 @Override public void onPrepareOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. //in this instance we wont as it will create a duplicate SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView(); searchView.setOnQueryTextListener(null); searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener(){ @Override public boolean onQueryTextSubmit(String query) { return false; } @Override public boolean onQueryTextChange(String newText) { showResults(newText); return false; } }); super.onPrepareOptionsMenu(menu); } 

И я вызвал setHasOptionsMenu (true) в onCreateView этого фрагмента, это работает отлично, но у меня есть около 20 фрагментов для циклического перехода, и когда я добавляю это к другим фрагментам, которые он терпит неудачу, он ничего не делает или делает вид пустым или в редких случаях Работает, но это для меня говорит, что мой код в порядке и, возможно, его жизненный цикл, ive попробовал называть его из onCreateOptionsMenu фрагментов и добился тех же результатов, и ive попытался ничего не называть из MainActivity в onCreateOptions, кроме раздувания меню и Разрешить фрагментам вызывать операцию поиска, используя

 SearchView searchView = (SearchView)menu.findItem (R.id.action_search).getActionView(); SearchManager searchManager = (SearchManager) getActivity().getSystemService(getActivity().SEARCH_SERVICE); searchView.setSearchableInfo(searchManager.getSearchableInfo (getActivity().getComponentName())); 

Который снова работает примерно до 8 фрагментов, но мои 20 или около того просто заставляют его падать на свой меч, есть ли что-то, что я не делаю, что может помочь

Редактирование 3 Итак, добавив некоторые, проверив его, добавив еще несколько, проверив его, кажется, проблема с моими родительскими фрагментами, поэтому у меня есть основные фрагменты активности 4, каждая из которых содержит пейджер состояния фрагмента, каждый из которых содержит 7 или около того фрагментов, если Я добавляю методы для прослушивателя запросов к первым 7 или около того фрагментам в первом родительском фрагменте, все они прекрасно работают, если я затем добавлю методы к следующему набору из 7 или около того фрагментов во втором родителе только для вторых дочерних фрагментов родителей Работа, если я затем выхожу из своего приложения и снова открою его, только первые фрагменты родительских работ будут продолжены, чтобы расследовать любую полезную помощь. Я скоро отправлю код для моих родительских фрагментов.

РЕДАКТИРОВАТЬ 4 Просто добавлю код, который я использую для родительских фрагментов, и фрагментарный накопитель из моей основной деятельности

Поэтому из моей основной деятельности я устанавливаю этот фрагмент-накопитель следующим образом

  private void setupViewPager(ViewPager viewPager) { ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); adapter.addFrag(new sentenceMakers(), "QUICKS"); adapter.addFrag(new tabFragOne(), "NOUNS"); adapter.addFrag(new tabFragTwo(), "VERBS"); adapter.addFrag(new tabFragThree(), "OBJECTS"); viewPager.setAdapter(adapter); } class ViewPagerAdapter extends FragmentStatePagerAdapter { private final List<Fragment> mFragmentList = new ArrayList<>(); private final List<String> mFragmentTitleList = new ArrayList<>(); public ViewPagerAdapter(FragmentManager manager) { super(manager); } @Override public Fragment getItem(int position) { return mFragmentList.get(position); } @Override public void restoreState(Parcelable arg0, ClassLoader arg1) { //do nothing here! no call to super.restoreState(arg0, arg1); } @Override public int getCount() { return mFragmentList.size(); } public void addFrag(Fragment fragment, String title) { mFragmentList.add(fragment); mFragmentTitleList.add(title); } @Override public CharSequence getPageTitle(int position) { return mFragmentTitleList.get(position); } } 

И мои родительские фрагменты выглядят так

 public class sentenceMakers extends Fragment{ public ImageView imageView; private ViewPager viewPager; public static TabLayout tabLayout; public sentenceMakers() { // Required empty public constructor } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public void onViewCreated(View view, Bundle savedInstanceState){ } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate (R.layout.tab_frag_one, container, false); // Inflate the layout for this fragment //setRetainInstance(true); viewPager = (ViewPager) rootView.findViewById(R.id.viewpager); setupViewPager(viewPager); tabLayout = (TabLayout) rootView.findViewById(R.id.tabs); tabLayout.setupWithViewPager(viewPager); setupTabIcons(); return rootView; } @Override public void onActivityCreated(Bundle savedInstanceState){ super.onActivityCreated(savedInstanceState); } private void setupTabIcons() { TextView tabZero2 = (TextView) LayoutInflater.from(getActivity()).inflate(R.layout.custom_tab, null); tabZero2.setText("FAVOURITES"); //tabOne.setGravity(View.TEXT_ALIGNMENT_CENTER); tabZero2.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.ic_star_white_24dp, 0, 0); tabLayout.getTabAt(0).setCustomView(tabZero2); TextView tabZero = (TextView) LayoutInflater.from(getActivity()).inflate(R.layout.custom_tab, null); tabZero.setText("FREQUENTS"); //tabOne.setGravity(View.TEXT_ALIGNMENT_CENTER); tabZero.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.ic_people_outline_white_24dp, 0, 0); tabLayout.getTabAt(1).setCustomView(tabZero); TextView tabOne = (TextView) LayoutInflater.from(getActivity()).inflate(R.layout.custom_tab, null); tabOne.setText("PRONOUNS"); //tabOne.setGravity(View.TEXT_ALIGNMENT_CENTER); tabOne.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.ic_accessibility_white_24dp, 0, 0); tabLayout.getTabAt(2).setCustomView(tabOne); TextView tabTwo = (TextView) LayoutInflater.from(getActivity()).inflate(R.layout.custom_tab, null); tabTwo.setText("CONJUCTIONS"); tabTwo.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.ic_add_white_24dp, 0, 0); tabLayout.getTabAt(3).setCustomView(tabTwo); TextView tabThree = (TextView) LayoutInflater.from(getActivity()).inflate(R.layout.custom_tab, null); tabThree.setText("ADJECTIVES"); tabThree.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.ic_favorite_border_white_24dp, 0, 0); tabLayout.getTabAt(4).setCustomView(tabThree); tabLayout.getTabAt(0).getCustomView().setSelected(true); } private void setupViewPager(ViewPager viewPager) { ViewPagerAdapter adapter = new ViewPagerAdapter(getChildFragmentManager()); adapter.addFrag(new favouriteCards(), "FAVOURITES"); adapter.addFrag(new predictedCards(), "FREQUENTS"); adapter.addFrag(new pronouns(), "PRONOUNS"); adapter.addFrag(new conjuctions(), "CONJUNCTIONS"); adapter.addFrag(new Others(), "ADJECTIVES"); viewPager.setAdapter(adapter); } class ViewPagerAdapter extends FragmentPagerAdapter { private final List<Fragment> mFragmentList = new ArrayList<>(); private final List<String> mFragmentTitleList = new ArrayList<>(); public ViewPagerAdapter(FragmentManager manager) { super(manager); } @Override public Fragment getItem(int position) { return mFragmentList.get(position); } @Override public int getCount() { return mFragmentList.size(); } public void addFrag(Fragment fragment, String title) { mFragmentList.add(fragment); mFragmentTitleList.add(title); } } } 

Все еще борюсь с этим, и я не могу для жизни меня разобраться, почему он будет работать в одном фрагменте фрагментов, пока я не добавлю его к следующему набору, его то же самое с тем же кодом он должен просто инициализировать последние фрагменты, которые Спрашивая, может ли кто-нибудь помочь мне здесь? Спасибо за любую помощь

    В принципе, вы должны иметь в виду, когда используете фрагменты: не держите ссылки на свои фрагменты : просто создавайте их и добавляйте в свой макет или предоставляйте свой ViewPager, а затем используйте другие методы для их извлечения, например FragmentManager.findFragmentBy …

    Тем не менее, ваш код будет (позвольте мне упростить всего двумя фрагментами):

    Основная деятельность

     private void setupViewPager(ViewPager viewPager) { ViewPagerAdapter adapter = new MyViewPagerAdapter(getSupportFragmentManager()); viewPager.setAdapter(adapter); } class MyViewPagerAdapter extends FragmentStatePagerAdapter { public ViewPagerAdapter(FragmentManager manager) { super(manager); } @Override public Fragment getItem(int position) { switch(position) { case 0: return new sentenceMakers(); case 1: return new tabFragOne(); // add here fragments for any other position } } @Override public int getCount() { return 2; } @Override public CharSequence getPageTitle(int position) { switch(position) { case 0: return "QUICKS"; case 1: return "NOUNS"; // add here titles for any other position } } } 

    sentenceMakers

    Код, который вы должны будете использовать в своем фрейме предложений OfferMakers, очень похож на предыдущий, но вам придется использовать дочерний фрагментатор (как и в вашем коде) и снова, не сохраняйте свои фрагменты в списке, Система создает их, когда это необходимо.

    ОК, я исправил его, поэтому проблема заключается в том, что родительский фрагмент-накопитель загружает фрагмент А + фрагмент В в память, тогда дочерние фрагменты-файлы-накопители загружают собственный childfragmentA + childfragmentB, поэтому у нас теперь есть 2 родителя и 4 ребенка, onPrepareOptionsMenu вызывается из дочерних фрагментов, поэтому первый Загружается childfragmentA (дочерний элемент фрагмента A), а затем childFragmentA (дочерний элемент фрагмента B) загружается и крадет вид поиска, мое исправление для этого, вероятно, немного грубо, я самоучтен, и я не очень понимаю, как Управлять памятью или если ее плохо держать ссылки и т. Д., Я отвлекаясь, в родительском фрагменте я проверяю, какой фрагмент видим, используя

     setMenuVisibility(final boolean visible) 

    И там я устанавливаю публичное статическое логическое значение и проверяю его в своих дочерних фрагментах, и он работает безупречно для меня, поскольку упоминается, что это, вероятно, ужасная вещь, которую можно надеяться, кто-то здесь может дать лучшее решение

    Проверить, какой родитель

     public static boolean tabFragOneVisible; @Override public void setUserVisibleHint(boolean isVisible){ super.setUserVisibleHint(isVisible); if(!isVisible){ tabFragOneVisible = false; }else{ tabFragOneVisible = true; } } 

    Проверить, отображается ли родительский объект

     @Override public void onPrepareOptionsMenu(Menu menu) { // need to check if fragment is visible if (tabFragOne.tabFragOneVisible) { SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView(); SearchManager searchManager = (SearchManager) getActivity() .getSystemService(getActivity().SEARCH_SERVICE); searchView.setSearchableInfo(searchManager .getSearchableInfo(getActivity().getComponentName())); // searchView.setOnQueryTextListener(null); searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { return false; } @Override public boolean onQueryTextChange(String newText) { showResults(newText); return false; } }); } else{ } super.onPrepareOptionsMenu(menu); }