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

Я использую 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
Добавьте определенное количество времени в текущее время и напишите его Как подключить Android к серверу базы данных Android 4.1.1 Build Stack for Activity при получении уведомления с URI Как включить автоматический запуск для моего приложения в xiaomi программно Ошибка: не удалось инициализировать класс com.android.ide.common.util.ReadWriteProcessLock после обновления до AS 2.4 Попытка заставить Android LinearLayout растягиваться горизонтально и вертикально Android-эмулятор – нет подключения к интернету Android – SurfaceView мерцает и иногда не применяет правильную краску Ошибка разрешения записи файла в Android Каковы последствия, если мы попытаемся постоянно подключать Native Thread к DVM (JVM)? Обнаружение сетевых принтеров Android: NullPointerException Android Studio: «Ошибка: не удалось найти или загрузить основной класс» Получить значение цвета по умолчанию для параметра EditText для темы AdMob Android запрашивает объявления, пока программа не отображается Правила именования для Android-ресурсов