调用片段函数而不是活动

时间:2015-12-09 15:41:51

标签: android android-fragments android-tabhost

我有一个带有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;
    }
}

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

使用ViewPager时,它比平常有点棘手,因为您无法使用首选的findFragmentByTag()方法。这是你可以尝试的东西 - 它未经测试,但应该没问题:

  1. 创建一个界面,Fragment中的所有ViewPager实现:

    public interface ViewPagerFragmentBase {
    
        void callCommonMethod(int code);
    
    }
    
  2. 在所有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
            }
    
        }
    
  3. 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
  4. 如果代码与您尝试访问的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();