簡體   English   中英

從MainActivity訪問片段返回null(無法調用片段方法)

[英]Accessing a fragment from MainActivity return null (can not call fragment methods)

我一天都在Google上搜索有關該主題的所有內容,但似乎沒有任何解決方案。 我已將viewpager添加到我的主要活動中。 多虧了頁面適配器,它附帶了兩個片段。 我從主要活動中初始化了OnCreate方法上的所有內容。 視圖分頁器工作正常。 問題是當我想從MainActivity中訪問片段中包含的textviews時。 我在每個片段中創建了一個Set方法,該方法根據參數修改了textviews。 因此,為了從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方法的最后一行使應用程序崩潰。 感謝您的寶貴幫助。

所以這里的問題是, registeredFragments還沒有實例化片段。 首先,您可以檢查fragment1是否為null以防止崩潰。

此外,您寧願將初始化方法放在適配器的getItem()或片段的onViewCreated()中,並在需要時在以后的生命周期方法中進行一些更新。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM