从MainActivity访问片段返回null(不能调用片段方法)

时间:2018-01-11 23:16:03

标签: java android android-fragments

我在一天中搜索了关于这个主题的所有内容,似乎没有什么可以解决我的项目。我在我的主要活动中添加了一个viewpager。由于页面适配器,它附加了两个片段。我从主要活动初始化了OnCreate方法的所有内容。视图寻呼机运行良好。问题是当我想从我的MainActivity访问我的片段中包含的文本视图时。我在每个片段中创建了一个Set方法,它根据参数修改textview。因此,为了从我的MainActivity中调用此方法,我必须在MainActivity上实例化片段,问题是这行代码返回null并且片段无法实例化。以下是用于测试此目的的代码。

主要活动

public class MainActivity extends AppCompatActivity{
  private SecondActivitySwipeAdapter adapterViewPager;
  private FirstFragmentSwipe fragment1;

  @Override
  public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      Log.v(TAG, "onCreate");

      setContentView(R.layout.main_activity_test);

      ViewPager vpPager = (ViewPager) findViewById(R.id.viewpager);
      adapterViewPager = new SecondActivitySwipeAdapter(getSupportFragmentManager());
      vpPager.setAdapter(adapterViewPager);

      fragment1 = (FirstFragmentSwipe) adapterViewPager.getRegisteredFragment(vpPager.getCurrentItem());

      fragment1.setTextViews(1,2,3,4,5);
  }
 ...
}

SecondActivitySwipeAdapter

public class SecondActivitySwipeAdapter extends FragmentStatePagerAdapter {

SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>();
private static int NUM_ITEMS = 2;
private FragmentManager mFragmentManager;

public SecondActivitySwipeAdapter(FragmentManager fragmentManager) {
    super(fragmentManager);
    mFragmentManager = fragmentManager;
}

// Returns total number of pages
@Override
public int getCount() {
    return NUM_ITEMS;
}

// Returns the fragment to display for that page
@Override
public Fragment getItem(int position) {

    switch (position) {
        case 0:
            return FirstFragmentSwipe.newInstance();
        case 1:
            return SecondFragmentSwipe.newInstance();
        default:
            return null;
    }

}

@Override
public Object instantiateItem(ViewGroup container, int position) {
    Fragment fragment = (Fragment) super.instantiateItem(container, position);
    registeredFragments.put(position, fragment);
    return fragment;
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    registeredFragments.remove(position);
    super.destroyItem(container, position, object);
}

public Fragment getRegisteredFragment(int position) {
    return registeredFragments.get(position);

}
}

FirstFragmentSwipe

public class FirstFragmentSwipe extends Fragment {

private TextView avg1;
private TextView avg2;
private TextView avg3;
private TextView avg4;
private TextView avg5;

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

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.swipelayout1, container, false);

    avg1 = view.findViewById(R.id.pwrAvgNmbview1);
    avg2 = view.findViewById(R.id.pwrAvgNmbview2);
    avg3 = view.findViewById(R.id.pwrAvgNmbview3);
    avg4 = view.findViewById(R.id.pwrAvgNmbview4);
    avg5 = view.findViewById(R.id.pwrAvgNmbview5);

    return view;
}

public void setTextViews(int avg1, int avg2, int avg3, int avg4, int avg5){
    this.avg1.setText(Integer.toString(avg1));
    this.avg2.setText(Integer.toString(avg2));
    this.avg3.setText(Integer.toString(avg3));
    this.avg4.setText(Integer.toString(avg4));
    this.avg5.setText(Integer.toString(avg5));
}



}

第二个片段与片刻基本相同。我正在使用谷歌搜索找到的一些想法。 onCreate方法的最后一行使应用程序崩溃。谢谢你的宝贵帮助。

1 个答案:

答案 0 :(得分:0)

所以这里的问题是registeredFragments还没有实例化片段。 首先,您可以检查fragment1是否为null以防止崩溃。

此外,您宁愿将初始化方法放在适配器的getItem()或片段的onViewCreated()中,并在以后的生命周期方法中进行更新(如果需要)。