从Activity调用Tabbed Fragment方法

use*_*541 7 tabs android android-fragments fragmentpageradapter

我有一个包含三个片段的活动.片段使用PagerAdapter使用操作栏选项卡.我想要做的是从主活动中访问活动选项卡式片段中的方法.我已经尝试了下面的代码,但这只是将片段返回为null,所以我猜它无法在标签中找到它!

 NPListFragment articleFrag = (NPListFragment) getSupportFragmentManager().findFragmentByTag("NP");
    articleFrag.refreshT();
Run Code Online (Sandbox Code Playgroud)

PagerAdapter:

public class AppSectionsPagerAdapter extends FragmentPagerAdapter {
public AppSectionsPagerAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int i) {
    switch (i) {
        case 0:
            return new NPListFragment();
        case 1:
            return new PListFragment();
        case 2:
            return new FavouritesFragment();
    }
    return null;
}

@Override
public int getCount() {
    return 3;
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以提出建议吗?我花了大约6个小时,我只是没有取得任何进展来解决这个问题.

Ste*_*his 20

你应该做的是:每个片段只创建一次,然后为getItem方法的所有调用提供它.

例如 :

public class AppSectionsPagerAdapter extends FragmentPagerAdapter {

Fragment one, two, three;

public AppSectionsPagerAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int i) {
    switch (i) {
        case 0:
            if(one == null)
                one = new NPListFragment();
            return one;
        case 1:
            if(two == null)
                two= new PListFragment();
            return two;
        case 2:
            if(three == null)
                three= new FavouritesFragment();
            return three;
    }
    return null;
}

@Override
public int getCount() {
    return 3;
}

} 
Run Code Online (Sandbox Code Playgroud)

现在,即使您在活动中也可以打电话 getItem

如果要调用特定方法,则只需将其强制转换为真正的片段类.

int pos = viewpager.getCurrentItem();    
Fragment activeFragment = adapter.getItem(pos);
if(pos == 0)
    ((NPListFragment)activeFragment).refreshT();
...
Run Code Online (Sandbox Code Playgroud)

  • 这将创建另一个空片段,它们的视图将为null.您需要注册以前创建的片段并通过getter方法访问它们. (2认同)

Ege*_*tçu 5

您需要在填充时注册片段,然后从外部访问它们。

public class AppSectionsPagerAdapter extends FragmentPagerAdapter {
private SparseArray<Fragment> registeredFragments = new SparseArray<>();
public AppSectionsPagerAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int i) {
    switch (i) {
        case 0:
            return new NPListFragment();
        case 1:
            return new PListFragment();
        case 2:
            return new FavouritesFragment();
    }
    return null;
}

@Override
public int getCount() {
    return 3;
}

@Override
public Object instantiateItem(ViewGroup container, int position) {
    Fragment fragment = (Fragment) super.instantiateItem(container, position);
    registeredFragments.put(position, fragment);
    return fragment;
}

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

public Fragment getRegisteredFragment(int position) {
    return registeredFragments.get(position);
}
Run Code Online (Sandbox Code Playgroud)

现在您可以从外部获取registeredFragments

int pos = viewpager.getCurrentItem();
Fragment fragment = adapter.getRegisteredFragment(pos);
switch (pos) {
    case 0: {
        ((NPListFragment) fragment).refreshT();
        break;
    }
    case 1: {
        ((PListFragment) fragment).refreshK();
        break;
    }
    case 2: {
        ((FavouritesFragment) fragment).refreshL();
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)