Android:从MainActivity访问片段实例



我已经开始使用Android Studio预定义的带片段的选项卡布局(SectionsPagerAdapter,ViewPager)编写一个小型应用程序。

我在MainActivity.class main/Ui线程中运行了一个任务,该线程一度显示了一个带有onClick方法的对话框

@Override
        public void onClick(DialogInterface dialog, int which) {
            category = eventsToDisplay.get(which);
            averageFragment.category = category;
            dialog.dismiss();
        }

但我不能让averageFragment.category = category;的任务开始工作。

在MainActivity的onCreate方法中,我调用averageFragment = (AverageFragment) getSupportFragmentManager().findFragmentByTag(AverageFragment.tag);,但这会给我一个NullPointerException。

我已经尝试了以下解决方案(大部分来自本网站):

  • getSupportFragmentManager().findFragmentById(R.id.fragment_average)
  • getSupportFragmentManager().findFragmentByTag(AverageFragment.tag)<--基本上是在实例化片段时创建的静态变量
  • mSectionsPageAdapter.getItem(1)

所有这些都给了我一个NPE或IllegalStateException.FragmentNotAttachedToView.

其他相关代码:

public class SectionsPagerAdapter extends FragmentPagerAdapter {
    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }
    @Override
    public Fragment getItem(int position) {
        // getItem is called to instantiate the fragment for the given page.
        switch (position) {
            case 0:
                return InspectionFragment.newInstance(position + 1);
            case 1:
                return AverageFragment.newInstance(position + 1);
            case 2:
                return RegulationsFragment.newInstance(position + 1);
        }
        return null;
    }
    @Override
    public int getCount() {
        // Show 3 total pages.
        return 3;
    }
    @Override
    public CharSequence getPageTitle(int position) {
        Locale l = Locale.getDefault();
        switch (position) {
            case 0:
                return getString(R.string.title_section1).toUpperCase(l);
            case 1:
                return getString(R.string.title_section2).toUpperCase(l);
            case 2:
                return getString(R.string.title_section3).toUpperCase(l);
        }
        return null;
    }
}

关于如何从主要活动中访问片段,有什么想法吗?

检查将适配器实例分配给寻呼机的位置。你得到的异常意味着片段还没有加载到视图中,这很可能是因为你正在调用你的任务:

averageFragment = (AverageFragment) getSupportFragmentManager().findFragmentByTag(AverageFragment.tag);

来自onCreate()方法。尝试将此赋值移动到onResume()中,这将确保您的片段已加载到视图中,并且可以通过supportFragmentManager进行访问。还要确保在活动的生命周期内设置寻呼机的适配器之后才进行此分配。

最新更新