使用FragmentPagerAdapter时,如何从Activity调用Fragment的方法?
刚好之前处理过类似的场景,没法用findFragmentById()或findFragmentByTag()确实有点棘手,给你几个实用的解决方案:
解决方案
方法1:直接保存第一个Fragment的实例(最简单直接)
因为这些Fragment是你自己在FragmentPagerAdapter中创建的,完全可以在MainActivity里保留第一个Fragment的引用,这样调用起来最方便:
- 在MainActivity中声明成员变量:
private FirstFragment mFirstFragment; // 替换成你实际的第一个Fragment类名
- 在你的
FragmentPagerAdapter的getItem()方法里,创建Fragment时给这个变量赋值:
@Override public Fragment getItem(int position) { switch(position) { case 0: if (mFirstFragment == null) { mFirstFragment = new FirstFragment(); } return mFirstFragment; case 1: return new SecondFragment(); // 第二个Fragment类 case 2: return new ThirdFragment(); // 第三个Fragment类 default: return null; } }
- 之后在MainActivity需要触发的地方,直接用这个引用调用方法就行,记得加安全判断:
if (mFirstFragment != null && mFirstFragment.isAdded()) { mFirstFragment.myToast("你要显示的提示文本"); }
加
isAdded()是为了避免Fragment还没依附到Activity时调用,防止空指针异常。
方法2:使用接口回调(更解耦的设计)
如果想让代码更符合面向对象的解耦原则,不想直接持有Fragment的强引用,可以用接口回调的方式:
- 先定义一个回调接口:
public interface ToastTrigger { void triggerToast(String text); }
- 让你的第一个Fragment实现这个接口,在实现方法里调用你已经写好的
myToast():
public class FirstFragment extends Fragment implements ToastTrigger { // ... 你原有的代码 @Override public void triggerToast(String text) { myToast(text); } public void myToast(String text){ Toast.makeText(getActivity(), text, Toast.LENGTH_LONG).show(); } }
- 在MainActivity里持有这个接口的引用,同样在Adapter创建Fragment时赋值:
private ToastTrigger mToastTrigger; // 在Adapter的getItem()方法中 case 0: FirstFragment firstFragment = new FirstFragment(); mToastTrigger = firstFragment; return firstFragment;
- 调用时直接通过接口触发:
if (mToastTrigger != null) { mToastTrigger.triggerToast("你要显示的提示文本"); }
方法3:通过ViewPager获取Fragment(不推荐,但应急可用)
如果你不想保存实例,也可以通过ViewPager的适配器获取,但这个方法可能会创建新的Fragment实例,所以可靠性不如前两种,仅作应急参考:
FirstFragment firstFragment = (FirstFragment) mViewPager.getAdapter().instantiateItem(mViewPager, 0); if (firstFragment.isAdded()) { firstFragment.myToast("你要显示的提示文本"); }
内容的提问来源于stack exchange,提问作者shariful islam
相关产品推荐
相关产品推荐

