簡體   English   中英

從Activity調用Tabbed Fragment方法

[英]Call Tabbed Fragment method from Activity

我有一個包含三個片段的活動。 片段使用PagerAdapter使用操作欄選項卡。 我想要做的是從主活動中訪問活動選項卡式片段中的方法。 我已經嘗試了下面的代碼,但這只是將片段返回為null,所以我猜它無法在標簽中找到它!

 NPListFragment articleFrag = (NPListFragment) getSupportFragmentManager().findFragmentByTag("NP");
    articleFrag.refreshT();

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;
}

任何人都可以提出建議嗎? 我花了大約6個小時,我只是沒有取得任何進展來解決這個問題。

你應該做的是:每個片段只創建一次,然后為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;
}

} 

現在,即使您在活動中也可以調用getItem

如果要調用特定方法,則只需將其強制轉換為真正的片段類。

int pos = viewpager.getCurrentItem();    
Fragment activeFragment = adapter.getItem(pos);
if(pos == 0)
    ((NPListFragment)activeFragment).refreshT();
...

您需要在填充時注冊片段,然后從外部訪問它們。

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);
}

現在您可以從外部獲取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;
    }
}

我解決了這個問題。

它正在發生,因為每次調用get項時都有一個新的Fragment初始化。

要解決此問題,您需要在onCreate方法中創建一個Required Fragment數組

Fragment[] FragmentArray;
FragmentArray = new Fragment[] {new Fragment 1,new Fragment 2...};   // all fragment goes in array
...

get item(int position)
...
return FragmentArray[position]
...
Fragment1 f= (Fragment1) FragmentArray[0];
f.refresh()  // call required function

我使用片段管理器來獲取片段。 我的片段在ViewPagerAdapter.class中的視圖尋呼機中初始化,如下所示 -

@Override
    public Fragment getItem(int i) {
        Fragment fragment = null;
        switch (i) {
            case 0:
                fragment = Fragment.instantiate(mContext, Fragment1.class.getName());
                break;
            case 1:
                fragment = Fragment.instantiate(mContext, Fragment2.class.getName());
                break;
            case 2:
                fragment = Fragment.instantiate(mContext, Fragment3.class.getName());
                break;
        }
        return fragment;
    }

然后在MainActivity中 -

List<Fragment> fragments = getSupportFragmentManager().getFragments();
        if (fragments != null) {
            for (Fragment fragment : fragments) {
                if (fragment instanceof Fragment1) {
                    ((Fragment1) fragment).fragmentOne();
                    break;
                }
            }
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM