简体   繁体   English

如何在活动的片段中调用方法

[英]How to call a method in a fragment from an activity

I have an activity, PagerAdapter (to return a fragment) and ViewPager inside the activity. 我有一个活动,PagerAdapter(返回一个片段)和活动中的ViewPager。

Others suggest using the following code 其他人建议使用以下代码

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

However, I can't find a way to get a reference of the fragment R.id.example_fragment . 但是,我找不到找到片段R.id.example_fragment的引用的R.id.example_fragment

Here's my activity 这是我的活动

public class TestActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);


         TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout);
        tabLayout.addTab(tabLayout.newTab().setText("Test1"));
        tabLayout.addTab(tabLayout.newTab().setText("Test2"));
        tabLayout.addTab(tabLayout.newTab().setText("Test3"));
        tabLayout.addTab(tabLayout.newTab().setText("Test4"));
        tabLayout.addTab(tabLayout.newTab().setText("Test5"));
        tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

       viewPager = (ViewPager) findViewById(R.id.pager);
        adapter = new PagerAdapter(getSupportFragmentManager(), tabLayout.getTabCount());
        viewPager.setAdapter(adapter);
        viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
        tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                viewPager.setCurrentItem(tab.getPosition());
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });

        tabLayout.setScrollPosition(pageIndex,0f,true);
        viewPager.setCurrentItem(pageIndex);
    }
}

the layout 布局

<include
    android:id="@+id/toolbar"
    layout="@layout/toolbar" />

<android.support.v4.widget.DrawerLayout
    android:layout_below="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/main_layout" >
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <android.support.design.widget.TabLayout
            android:id="@+id/tab_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:minHeight="?attr/actionBarSize"
            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
            app:tabTextAppearance="@style/menuTheme"
            app:tabIndicatorHeight="4dp"
            app:tabMode="scrollable"
            />
        <android.support.v4.view.ViewPager
            android:id="@+id/pager"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"
            />

    </LinearLayout>
    <fragment
        android:id="@+id/fragment_navigation_drawer"
        android:name="com.musicplayer.mp3player.activities.FragmentDrawer"
        android:layout_width="@dimen/nav_drawer_width"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:layout="@layout/fragment_navigation_drawer"
        tools:layout="@layout/fragment_navigation_drawer" />
</android.support.v4.widget.DrawerLayout>
</RelativeLayout>

the code for the PageAdapter PageAdapter的代码

public class PagerAdapter extends FragmentPagerAdapter {
    int mNumOfTabs;

    public PagerAdapter(FragmentManager fm, int NumOfTabs) {
    super(fm);
    this.mNumOfTabs = NumOfTabs;
    }

    @Override
    public Fragment getItem(int position) {

        switch (position) {
            case 0:
                TestFragment testFragment = new TestFragment();
                return testFragment;
            case 1:
                TestFragment testFragment2 = new TestFragment2();
                return testFragment2;
            case 2:
                TestFragment testFragment3 = new TestFragment3();
                return testFragment3;
            case 3:
                TestFragment testFragment4 = new TestFragment4();
                return testFragment4;
            case 4:
                TestFragment testFragment5 = new TestFragment5();
                return testFragment5;
            default:
                return null;
        }
    }

    @Override
    public int getCount() {
        return mNumOfTabs;
    }
}

try like below: 尝试如下:

  // Returns the fragment to display for that page
    @Override
    public Fragment getItem(int position) {
        switch (position) {
        case 0: // Fragment # 0 - This will show FirstFragment
            return TestFragment.newInstance(0, "Page # 1");
        case 1: // Fragment # 0 - This will show FirstFragment different title
            return TestFragment2.newInstance(1, "Page # 2");
        case 2: // Fragment # 1 - This will show SecondFragment
            return TestFragment3.newInstance(2, "Page # 3");
        default:
            return null;
        }
    }

You can getInstance of Fragment like below: 您可以如下所示获取Fragment的实例:

viewpager.getcurrentItem().yourmethod();

In your Fragment Class Make Method Like below: 在您的Fragment类的Make方法中,如下所示:

public static DemoFragment newInstance() {
    return new DemoFragment();
}

Make sure Fragments are initialized only once : 确保片段仅初始化一次:

public class PagerAdapter extends FragmentPagerAdapter {
    int mNumOfTabs;
    TestFragment testFragment, testFragment2, testFragment3, testFragment4, testFragment5;
    public PagerAdapter(FragmentManager fm, int NumOfTabs) {
    super(fm);
    this.mNumOfTabs = NumOfTabs;
    }

    @Override
    public Fragment getItem(int position) {

        switch (position) {
            case 0:
                if( testFragment == null ) testFragment = new TestFragment();
                return testFragment;
            case 1:
                if( testFragment2 == null ) testFragment2 = new TestFragment2();
                return testFragment2;
            case 2:
                if( testFragment3 == null ) testFragment3 = new TestFragment3();
                return testFragment3;
            case 3:
                if( testFragment4 == null ) testFragment4 = new TestFragment4();
                return testFragment4;
            case 4:
                if( testFragment5 == null ) testFragment5 = new TestFragment5();
                return testFragment5;
            default:
                return null;
        }
    }

    @Override
    public int getCount() {
        return mNumOfTabs;
    }
}

Then call the method on the fragment : 然后在片段上调用方法:

    TestFragment testFragment = (TestFragment) viewpager.getcurrentItem(); 
// in case you are not sure, check using instanceOf to determine the Fragment type
    testFragment.specific_function_name();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM