我已经开始使用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;
}
}
有关如何从主要活动访问片段的任何想法?
答案 0 :(得分:0)
检查将适配器实例分配给寻呼机的位置。您获取的例外意味着片段尚未加载到视图中,这可能是因为您正在调用您的作业:
averageFragment = (AverageFragment) getSupportFragmentManager().findFragmentByTag(AverageFragment.tag);
来自onCreate()方法的。尝试将此赋值移动到onResume(),这应确保您的片段已加载到视图中并可通过supportFragmentManager访问。在活动生命周期内设置寻呼机适配器后,还要确保此分配正在进行。