Intereting Posts
Сделайте карусель с ViewFlipper или ViewPager Страница запуска приложений Android Командная строка ADB Подвешивание во время установки (PhoneGap) Инъекционные объекты стали нулевыми после обновления до Roboguice 3 Как загрузить HTML-файл, размещенный в приложении, с помощью Phonegap Как я могу создать таймер в Android? Как отправить несколько изображений, которые присутствуют в папке на диске Google в программном обеспечении Android? Android сравнивает два звука для фонетического соответствия Есть ли способ предоставить промо / купоны для людей, чтобы скачать приложение бесплатно? Пользовательская обработка SSL перестала работать на Android 2.2 FroYo Размер фонового изображения активности Android Повторная установка броска исключения IllegalArgumentException для асинхронного вызова DELETE FormUrlEncoded Почему NullPointerException при программном добавлении моего текстового представления? Приложение Android Facebook: срок доступа к токену (expires_in) всегда равен 0 Реализация 47degree android-swipelistview для прокрутки android ListViewItem

Как использовать 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); }