我有一个带有3个标签的TabLayout。它们是一个片段。
Test.java-> PagerAdapter.java-> TabFragment1 + TabFragment2 + TabFragment3
我想调用TabFragment1.helloworld()函数。我怎么称呼这个功能?感谢。
Test.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;
}
}
答案 0 :(得分:1)
您可以通过PagerAdapter访问所需的片段方法:
((TabFragment1)adapter.getItem(0)).helloworld();
答案 1 :(得分:1)
使用ViewPager
时,它比平常有点棘手,因为您无法使用首选的findFragmentByTag()
方法。这是你可以尝试的东西 - 它未经测试,但应该没问题:
创建一个界面,Fragment
中的所有ViewPager
实现:
public interface ViewPagerFragmentBase {
void callCommonMethod(int code);
}
在所有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
}
}
在Activity
课程中,抓住Fragment
中当前所有的Adapter
,然后循环浏览每个callCommonMethod()
,调用Fragment
以及代码表示您要覆盖的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
}
:
Fragment
如果代码与您尝试访问的EventBus
中的代码匹配,则该方法将会运行。
您还可以尝试的其他内容是Error:
Fatal Python error: Py_Initialize: can't initialize sys standard streams
Traceback (most recent call last):
File "/Users/nkosana/.pyenv/versions/3.4.2/lib/python3.4/io.py", line 52, in <module>
File "/Users/nkosana/.pyenv/versions/3.4.2/lib/python3.4/abc.py", line 3
^
SyntaxError: invalid character in identifier
Abort trap: 6
- 这可以让您更直接地实现目标,并减少输入:https://github.com/greenrobot/EventBus
答案 2 :(得分:0)
从parent
活动调用片段方法:
ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);
fragment.callFunction();
答案 3 :(得分:0)
我有同样的问题,这对我有用: 您必须通过适配器添加片段,然后才能访问片段函数:
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();