Android:从MainActivity访问片段实例

时间:2014-10-10 01:16:18

标签: java android android-fragments

我已经开始使用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;
    }
}

有关如何从主要活动访问片段的任何想法?

1 个答案:

答案 0 :(得分:0)

检查将适配器实例分配给寻呼机的位置。您获取的例外意味着片段尚未加载到视图中,这可能是因为您正在调用您的作业:

averageFragment = (AverageFragment) getSupportFragmentManager().findFragmentByTag(AverageFragment.tag);
来自onCreate()方法的

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