Android 在活动上调用片段函数

Android 在活动上调用片段函数,android,android-fragments,android-tabhost,Android,Android Fragments,Android Tabhost,我有一个有3个标签的表格,它们是一个片段 Test.java->PagerAdapter.java->TabFragment1+TabFragment2+TabFragment3 我想调用TabFragment1.helloworld()函数。如何调用此函数?谢谢 java在下面创建了3个选项卡 Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar);

我有一个有3个标签的表格,它们是一个片段

Test.java->PagerAdapter.java->TabFragment1+TabFragment2+TabFragment3

我想调用TabFragment1.helloworld()函数。如何调用此函数?谢谢

java在下面创建了3个选项卡

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

    TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout);

    tabLayout.addTab(tabLayout.newTab().setText("tab1"));

    tabLayout.addTab(tabLayout.newTab().setText("tab2"));                        

    tabLayout.addTab(tabLayout.newTab().setText("tab3"));

    tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

    final ViewPager viewPager = (ViewPager) findViewById(R.id.pager);

    viewPager.setOffscreenPageLimit(3);


final PagerAdapter adapter = new PagerAdapter
                                    (getSupportFragmentManager(), 
tabLayout.getTabCount());

viewPager.setAdapter(adapter);
PagerAdapter.java

public class PagerAdapter extends FragmentStatePagerAdapter {
    int mNumOfTabs;

    public PagerAdapter(FragmentManager fm, int NumOfTabs) {
        super(fm);
        this.mNumOfTabs = NumOfTabs;
    }

    @Override
    public Fragment getItem(int position) {

        switch (position) {
            case 0:
                TabFragment1 tab1 = new TabFragment1();
                return tab1;
            case 1:
                TabFragment2 tab2 = new TabFragment2();
                return tab2;
            case 2:
                TabFragment3 tab3 = new TabFragment3();
                return tab3;
            default:
                return null;
        }
    }

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

要从父级调用片段方法,请执行以下操作:

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);
fragment.callFunction(); 

您可以通过PagerAdapter访问所需片段的方法:

((TabFragment1)adapter.getItem(0)).helloworld();

使用
ViewPager
s比通常要复杂一些,因为您不能使用首选的
findFragmentByTag()
方法。以下是一些您可以尝试的东西-它未经测试,但应该可以:

  • 创建一个界面,您的
    ViewPager中的所有
    Fragment
    s实现:

    public interface ViewPagerFragmentBase {
    
        void callCommonMethod(int code);
    
    }
    
  • 在所有的
    ViewPager
    片段中实现它:

    public FragmentOne implements ViewPagerFragmentBase {
    
        @Override
        public void callCommonMethod(int code) {
    
            if (code == 1) {
                //Run code in this Fragment
            }
    
        }
    
    public FragmentTwo implements ViewPagerFragmentBase {
    
        @Override
        public void callCommonMethod(int code) {
    
            if (code == 2) {
                //Run code in this Fragment
            }
    
        }
    
  • 活动
    类中,抓取当前
    适配器
    中的所有
    片段
    ,然后循环遍历每一个片段,调用
    callCommonMethod()
    以及一个代码,该代码指示您试图访问的
    片段

    public class MainActivity extends AppCompatActivity {
    
        private void callCommonMethodInFragments(int code) {
    
            for (int i = 0; i < viewPagerAdapter.getCount(); i++) {
                ((ViewPagerFragmentBase)viewPagerAdapter.getItem(i)).callCommonMethod(code);
            }
    
        }
    
        //To call it...
        callCommonMethodInFragments(1); //This will run the method in FragmentOne only
    
    }
    
    public类MainActivity扩展了AppCompatActivity{
    私有无效调用CommonMethodInfragments(内部代码){
    对于(int i=0;i
  • 如果代码与您试图访问的
    片段中的代码匹配,则该方法将运行


    您还可以尝试的另一种方法是
    EventBus
    ——这将使您能够更直接地实现目标,并且只需较少的输入:

    我也遇到了同样的问题,这对我很有效: 您必须通过适配器添加片段,然后才能访问片段函数:

        myViewPager = (ViewPager) findViewById(R.id.viewpager);
        MyAdapterClass adapter = new MyAdapterClass(getSupportFragmentManager());
        adapter.addFragment(new TabOneFragment(), "");
        adapter.addFragment(new TabTwoFragment(), "");
        adapter.addFragment(new TabThreeFragment(), "");
        myViewPager.setAdapter(adapter);
    
        myTabLayout = (TabLayout) findViewById(R.id.tab_layout);
    
        myTabLayout.setupWithViewPager(myViewPager);
    
        // to access fragment functions:
    
        TabOneFragment tabOneFragment = (TabOneFragment) adapter.getItem(0);
        tabOneFragment.functionWhatSoEver();
    

    它给出一个错误:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“android.content.Context android.support.v4.app.FragmentActivity.getBaseContext()”。使用库:otto或eventbus