【问题标题】:How to call a method in a fragment from an activity如何从活动中调用片段中的方法
【发布时间】:2016-08-01 03:03:54
【问题描述】:

我有一个活动,PagerAdapter(返回一个片段)和活动内的 ViewPager。

其他人建议使用以下代码

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

但是,我找不到获取片段 R.id.example_fragment 的引用的方法。

这是我的活动

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);
    }
}

布局

<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>

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;
    }
}

【问题讨论】:

标签: android android-layout android-fragments android-viewpager fragmentpageradapter


【解决方案1】:

确保片段只初始化一次:

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;
    }
}

然后在片段上调用方法:

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

【讨论】:

  • 调用“testFragment.specific_function_name();”时出现错误java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“android.content.ContentResolver android.support.v4.app.FragmentActivity.getContentResolver()”
  • 你能贴出抛出空指针异常的代码吗?
  • 您好,我刚刚修改了您的代码并将其放到了我的课堂上。导致错误的代码是我调用 testFragment.specific_function_name();
【解决方案2】:

尝试如下:

  // 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;
        }
    }

你可以像下面这样获取片段的实例:

viewpager.getcurrentItem().yourmethod();

在你的 Fragment 类中 Make 方法如下:

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

【讨论】:

  • 但您也有更好的选择。检查当前片段是否添加。
  • 我收到 newInstance 的“无法解析方法”错误。
  • @Julia 我有更新代码试试。在 Fragment 类中制作方法
  • 所以我需要为 DemoFragment 创建一个新的类片段?
  • @Julia 不,你只需要在每个片段中创建返回该片段实例的方法
猜你喜欢
  • 2021-12-23
  • 1970-01-01
  • 2013-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-15
  • 1970-01-01
相关资源
最近更新 更多