Я использую 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 для загрузки страниц для завершения или заставить задачу загрузки перейти на передний план, это было бы большой помощью для меня, спасибо