Call fragment function over activity

眉间皱痕 提交于 2019-12-11 14:39:17

问题


I have a TabLayout with 3 tab.They are a fragment.

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

I want to call TabFragment1.helloworld() function. How can i call this function? Thanks.

Test.java created 3 tabs in below

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

回答1:


You can access the desired fragment's method through your PagerAdapter:

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



回答2:


It's a bit trickier than usual with ViewPagers, because you can't use the preferred findFragmentByTag() method. Here's something you could try - it's untested, but should be ok:

  1. Create an interface, which all Fragments in your ViewPager implement:

    public interface ViewPagerFragmentBase {
    
        void callCommonMethod(int code);
    
    }
    
  2. Implement it in all your ViewPager Fragments:

    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
            }
    
        }
    
  3. Inside your Activity class, grab all Fragments currently in your Adapter, then cycle through each one, calling the callCommonMethod() along with a code which indicates the Fragment you are trying to reach:

    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
    
    }
    

If the code matches the one in the Fragment you are trying to reach, then the method will run.

Something else you could also try though is an EventBus - this would allow you to achieve your goal more directly, and with less typing: https://github.com/greenrobot/EventBus




回答3:


To call fragment method from parent activity:

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



回答4:


I had the same issue, and this worked for me: You have to add the fragments via your adapter and then you can access the fragment functions:

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


来源:https://stackoverflow.com/questions/34182919/call-fragment-function-over-activity

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!