Android 在活动上调用片段函数
我有一个有3个标签的表格,它们是一个片段 Test.java->PagerAdapter.java->TabFragment1+TabFragment2+TabFragment3 我想调用TabFragment1.helloworld()函数。如何调用此函数?谢谢 java在下面创建了3个选项卡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);
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