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

Я использую 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