Получить фрагмент из ViewPager - PullRequest
236 голосов
/ 09 января 2012

Я использую ViewPager вместе с FragmentStatePagerAdapter для размещения трех разных фрагментов:

  • [Fragment1]
  • [Fragment2]
  • [Фрагмент3]

Когда я хочу получить Fragment1 из ViewPager в FragmentActivity.

В чем проблема и как ее исправить?

Ответы [ 23 ]

2 голосов
/ 18 июня 2013

FragmentPagerAdapter - фабрика фрагментов. Чтобы найти фрагмент, основанный на его позиции, если он все еще находится в памяти, используйте это:

public Fragment findFragmentByPosition(int position) {
    FragmentPagerAdapter fragmentPagerAdapter = getFragmentPagerAdapter();
    return getSupportFragmentManager().findFragmentByTag(
            "android:switcher:" + getViewPager().getId() + ":"
                    + fragmentPagerAdapter.getItemId(position));
}

Пример кода для API поддержки v4.

2 голосов
/ 25 июня 2018

Эй, я ответил на этот вопрос здесь .По сути, вам необходимо переопределить

открытый объект instantiateItem (контейнер ViewGroup, int position)

метод FragmentStatePagerAdapter.

2 голосов
/ 09 января 2012

Я не мог найти простой, чистый способ сделать это. Однако виджет ViewPager - это просто еще одна ViewGroup, в которой хранятся ваши фрагменты. ViewPager имеет эти фрагменты как непосредственные потомки. Таким образом, вы можете просто перебрать их (используя .getChildCount () и .getChildAt ()) и посмотреть, загружен ли в данный момент искомый фрагмент в ViewPager, и получить ссылку на него. Например. Вы можете использовать какое-то статическое поле уникального идентификатора, чтобы отделить фрагменты.

Обратите внимание, что ViewPager, возможно, не загрузил искомый фрагмент, так как это виртуализированный контейнер, такой как ListView.

2 голосов
/ 24 июля 2017

Должно распространяться FragmentPagerAdapter на ваш класс адаптера ViewPager.Если вы используете FragmentStatePagerAdapter, то вы не сможете найти Fragment по его ID

public static String makeFragmentName(int viewPagerId, int index) {
  return "android:switcher:" + viewPagerId + ":" + index;
}

Как использовать этот метод: -

Fragment mFragment = ((FragmentActivity) getContext()).getSupportFragmentManager().findFragmentByTag(
       AppMethodUtils.makeFragmentName(mViewPager.getId(), i)
);
InterestViewFragment newFragment = (InterestViewFragment) mFragment;
1 голос
/ 30 июня 2014

Лучшее решение - использовать расширение, которое мы создали в CodePath и называется SmartFragmentStatePagerAdapter .Следуя этому руководству, это значительно упрощает извлечение фрагментов и текущего выбранного фрагмента из ViewPager.Он также лучше справляется с управлением памятью фрагментов, встроенных в адаптер.

0 голосов
/ 28 октября 2014

Самый простой и краткий способ. Если все ваши фрагменты в ViewPager принадлежат к разным классам, вы можете извлечь и различить их следующим образом:

public class MyActivity extends Activity
{

    @Override
    public void onAttachFragment(Fragment fragment) {
        super.onAttachFragment(fragment);
        if (fragment.getClass() == MyFragment.class) {
            mMyFragment = (MyFragment) fragment;
        }
    }

}
0 голосов
/ 19 июня 2018

в TabLayout есть несколько вкладок для фрагмента.Вы можете найти фрагмент по тегу, используя индекс фрагмента.

Например.индекс для Fragment1 равен 0, поэтому в методе findFragmentByTag() передайте тег для Viewpager. после использования фрагмента транзакции, который вы можете добавить, замените фрагмент.

String tag = "android:switcher:" + R.id.viewPager + ":" + 0; Fragment1 f = (Fragment1) getSupportFragmentManager().findFragmentByTag(tag);

0 голосов
/ 13 апреля 2017

во фрагменте

public int getArgument(){
   return mPage;
{
public void update(){

}

In FragmentActivity

List<Fragment> fragments = getSupportFragmentManager().getFragments();
for(Fragment f:fragments){
    if((f instanceof PageFragment)&&(!f.isDetached())){
          PageFragment pf = (PageFragment)f;   
          if(pf.getArgument()==pager.getCurrentItem())pf.update();
    }
}
0 голосов
/ 05 апреля 2013

Хорошо для адаптера FragmentStatePagerAdapter Я финансирую решение:

в вашем FragmentActivity:

ActionBar mActionBar = getSupportActionBar(); 
mActionBar.addTab(mActionBar.newTab().setText("TAB1").setTabListener(this).setTag(Fragment.instantiate(this, MyFragment1.class.getName())));
mActionBar.addTab(mActionBar.newTab().setText("TAB2").setTabListener(this).setTag(Fragment.instantiate(this, MyFragment2.class.getName())));
mActionBar.addTab(mActionBar.newTab().setText("TAB3").setTabListener(this).setTag(Fragment.instantiate(this, MyFragment3.class.getName())));

viewPager = (STViewPager) super.findViewById(R.id.viewpager);
mPagerAdapter = new MyPagerAdapter(getSupportFragmentManager(), mActionBar);
viewPager.setAdapter(this.mPagerAdapter);

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

public Fragment getActiveFragment(int position) {
String name = MyPagerAdapter.makeFragmentName(position);
return getSupportFragmentManager().findFragmentByTag(name);
}

в вашем адаптере:

public class MyPagerAdapter extends FragmentStatePagerAdapter {

private final ActionBar actionBar;
private final FragmentManager fragmentManager;

public MyPagerAdapter(FragmentManager fragmentManager, com.actionbarsherlock.app.ActionBarActionBar mActionBar) {super(fragmentManager);
this.actionBar = mActionBar;
this.fragmentManager = fragmentManager;
}

@Override
public Fragment getItem(int position) {
getSupportFragmentManager().beginTransaction().add(mTchatDetailsFragment, makeFragmentName(position)).commit();
return (Fragment)this.actionBar.getTabAt(position);
}

@Override
public int getCount() {
return this.actionBar.getTabCount();
}

@Override
public CharSequence getPageTitle(int position) {
return this.actionBar.getTabAt(position).getText();
}

private static String makeFragmentName(int viewId, int index) {
return "android:fragment:" + index;
}

}
0 голосов
/ 27 февраля 2017

Простой способ перебирать фрагменты в менеджере фрагментов. Найти viewpager, имеющий аргумент позиции раздела, помещенный в публичную статическую метку PlaceholderFragment newInstance (int sectionNumber) .

public PlaceholderFragment getFragmentByPosition(Integer pos){
    for(Fragment f:getChildFragmentManager().getFragments()){
        if(f.getId()==R.id.viewpager && f.getArguments().getInt("SECTNUM") - 1 == pos) {
            return (PlaceholderFragment) f;
        }
    }
    return null;
}
...