问题
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 ViewPager
s, because you can't use the preferred findFragmentByTag()
method. Here's something you could try - it's untested, but should be ok:
Create an interface, which all
Fragment
s in yourViewPager
implement:public interface ViewPagerFragmentBase { void callCommonMethod(int code); }
Implement it in all your
ViewPager
Fragment
s: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 } }
Inside your
Activity
class, grab allFragment
s currently in yourAdapter
, then cycle through each one, calling thecallCommonMethod()
along with a code which indicates theFragment
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