Получить фрагмент с помощью тега

Я использую FragmentPagerAdapter для создания пользовательского интерфейса с несколькими страницами с различными фрагментами. Я хочу сделать, чтобы найти Фрагмент, используя положение Фрагмента.

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

Вот код

MainActivity.java public void onCreate(Bundle savedInstanceState) { this.getSupportFragmentManager(); super.onCreate(savedInstanceState); setContentView(R.layout.main); MainActivity.instance=this; //Initialize pager vpPager = (ViewPager)findViewById(R.id.mypager); pagerAdapter = new MyPagerAdapter(getSupportFragmentManager()); vpPager.setAdapter(pagerAdapter); this.mapFragment = (MapFragment)this.findFragmentByPosition(0); this.drFragment = (DRFragment)this.findFragmentByPosition(1); this.sensorFragment = (SensorFragment)this.findFragmentByPosition(2); ...... } protected Fragment findFragmentByPosition(int position) { int pagerid = this.vpPager.getId(); long pagerAdapterid = this.pagerAdapter.getItemId(position); return getSupportFragmentManager().findFragmentByTag("android:switcher:" + pagerid + ":" + pagerAdapterid + ""); } 

 MyPagerAdapter.java import android.os.Parcelable; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.view.View; public class MyPagerAdapter extends FragmentPagerAdapter { private static final String TAG = "TM_PageAdapter"; private static int numItems = 3; public MyPagerAdapter(FragmentManager fragmentManager){ super(fragmentManager); } public int getCount() { return numItems; } @Override public Fragment getItem(int position) { switch(position){ case 0: return MapFragment.newInstance(0, "Map Information"); case 1: return DRFragment.newInstance(1, "DR Information"); case 2: return SensorFragment.newInstance(2, "Sensor Information"); default: return null; } } @Override public CharSequence getPageTitle(int position) { switch(position){ case 0: return "Map Information"; case 1: return "DR Information"; case 2: return "Sensor Information"; default: return null; } } public static String makeFragmentName(int viewId, int index) { return "android:switcher:" + viewId + ":" + index; } @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == ((View) arg1); } @Override public Parcelable saveState() { return null; } 

Вот один из кодов .newInstance:

 public static MapFragment newInstance(int position, String title){ MapFragment mapFragment = new MapFragment(); Bundle args = new Bundle(); args.putInt("current_page", 0); args.putString("page_tile", "Map Information"); mapFragment.setArguments(args); return mapFragment; } 

В findFragmentByPosition вы не используете индекс при поиске фрагмента:

 getSupportFragmentManager().findFragmentByTag("android:switcher:" + pagerid + ":" + pagerAdapterid + ""); 

Второй должен быть индекс, а не pagerAdapterId. Таким образом, правильный код:

 getSupportFragmentManager().findFragmentByTag("android:switcher:" + pagerid + ":" + position); 

Также нет необходимости конкатенировать последнюю пустую строку.

Я использовал этот подход в прошлом, и он работал достаточно хорошо.

В вашем адаптере вы можете объявить переменную экземпляра следующим образом:

 private Map<Integer, Fragment> mPageReferenceMap = new HashMap<Integer, Fragment>(); 

В вашем getItem () поместите ссылку на фрагмент на карте

 mPageReferenceMap.put(position, f); 

Переопределить метод InstantiateItem:

 /** * After an orientation change, the fragments are saved in the adapter, and * I don't want to double save them: I will retrieve them and put them in my * list again here. */ @Override public Object instantiateItem(ViewGroup container, int position) { Fragment fragment = (Fragment) super.instantiateItem(container, position); mPageReferenceMap.put(position, fragment); return fragment; } 

Переопределите onDestroyItem для очистки ссылок:

 @Override public void destroyItem(ViewGroup container, int position, Object object) { super.destroyItem(container, position, object); mPageReferenceMap.remove(position); } 

И, наконец, получить фрагмент в зависимости от его положения:

 public Fragment getFragment(int key) { return mPageReferenceMap.get(key); } 

Надеюсь, поможет.

Похоже, что причина, по которой моя ссылка переключиться на нуль, заключается в том, что загрузка фрагментов выполняется в фоновом режиме, и когда я ссылаюсь на эти фрагменты, загрузка еще не завершена (спасибо Даниэль Золнай за то, что вы это поняли, я бы дал вам правильный ответ Если и положил это как ответ) Мои мысли для решения теперь:

-Загрузите все страницы, если у вас мало страниц (ViewPager) .setOffScreenLimit (int limit)

-Перейдите к основному действию и подождите, пока все страницы будут загружены, а затем продолжите.

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

Intereting Posts
Как найти список адресов электронной почты для определенного формата? Как интегрировать платежный шлюз TEST PayU в приложение для Android? Прекращение соединения с медиа-плеером Android Разве Dagger 2 для Android не является каркасом DI, но прославил Service Locator? Robolectric getResources () выбрасывает RuntimeException (Android) Почему OnSeekBarChangeListener всегда возвращает логическую переменную false? Как читать Json.NET ISO 8601 формат в Gson? Xamarin Android: System.IO.Compression.ZipFile.ExtractToDirectory Сбой в режиме выпуска Android-эмулятор Mac OSX висит на экране с надписью «ANDROID_» Защелка (используется для ожидающего ответа на асинхронный режим) замораживает WebView (и пользовательский интерфейс) Meteor android build говорит: «Приложение не установлено» Android Studio – папка с макетами не появляется Прикрепленный заголовок / элемент в recycliewiew Android Google Maps фрагмент в xml. Я получаю "Неожиданный префикс пространства имен" Предотвращение «длительной печати» Android для сохранения изображений