Переменные-члены фрагмента становятся нулевыми при доступе в onPageSelected()

Я использую FragmentPagerAdapter с FragmentActivity для создания фрагментов с возможностью перелистывания.

Мой первый фрагмент в этом pagerAdapter выглядит так.

public class MySummaryFragment extends CommonFragment implements OnPageChangeListener 
{
   private Context mContext;
   private View mMyView;

LinearLayout mDetailLayout;
TextView mDateTxtView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    System.out.println("onCreateView() Market summary");
    mMyView = inflater.inflate(R.layout.my_page_summary_fragment_layout, container,false);
    mDetailLayout = (LinearLayout)mMyView.findViewById(R.id.SummaryDetailLayout);
    mDateTxtView = (TextView) mMyView.findViewById(R.id.txtDate);

    Account_Id = AccountDetails.getInstance(mContext).getClientCodes().get(0);
    sendRequest(Account_Id);

    return mMyView;

}


 @Override
public void onPageSelected(int arg0) {
    System.out.println("inside onPageScrollStateChanged()");
    System.out.println("mMyView is null ? = "+(mMyView==null));
    mDateTxtView = (TextView) mMyView.findViewById(R.id.txtMarketSummaryDate);
    Account_Id = AccountDetails.getInstance(mContext).getClientCodes().get(0);
        mDateTxtView.setText("");   
            sendRequest(Account_Id);
}
}

Проблема здесь в том, что я получаю исключение NullPointerException, когда пролистываю до 5-6 фрагментов и возвращаюсь к первому фрагменту.

Когда я пытаюсь отладить, я обнаружил, что

mMyView имеет значение null? = правда

Почему так?

Пожалуйста помогите.

Вот мой фрагмент содержит FragmentPagerAdapter,

public class MyPageDetailViewFragment  extends CommonFragment  {
private View mView;
Context mContext;
OnPageChangeListener pageChangeListener;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    mView = inflater.inflate(R.layout.my_page_fragments, null);
    mContext = getActivity();

    setHasOptionsMenu(false);

    setupSearchBarComponent();


    PagerTabStrip pagerTabStrip = (PagerTabStrip)mView. findViewById(R.id.pager_title_strip);
    pagerTabStrip.setDrawFullUnderline(true);
    pagerTabStrip.setTabIndicatorColor(Color.BLACK);

    /** Getting a reference to the ViewPager defined the layout file */        
    ViewPager pager = (ViewPager) mView.findViewById(R.id.pager);

    /** Getting fragment manager */
    FragmentManager fm = ((HomeScreenActivity)mContext).getSupportFragmentManager();

    /** Instantiating FragmentPagerAdapter */
    final MyFragmentPagerAdapter pagerAdapter = new MyFragmentPagerAdapter(fm);

    pager.setAdapter(pagerAdapter);

    pager.setCurrentItem(0);


    pageChangeListener = new OnPageChangeListener() {

        @Override
        public void onPageSelected(int selectedIndex) {
            System.out.println("selectedIndex = "+selectedIndex);
            Object page  = pagerAdapter.getItem(selectedIndex);
            if( page instanceof OnPageChangeListener){
                ((OnPageChangeListener) page).onPageSelected(selectedIndex);
            }
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {

        }

        @Override
        public void onPageScrollStateChanged(int arg0) {

        }
    };



    pager.setOnPageChangeListener(pageChangeListener);

    return mView;
    //      return super.onCreateView(inflater, container, savedInstanceState);
}

А вот моя реализация MyFragmentPagerAdapter,

public class MyFragmentPagerAdapter extends FragmentPagerAdapter {


/** Constructor of the class */
public MyFragmentPagerAdapter(FragmentManager fm) {
    super(fm);
}

/** This method will be invoked when a page is requested to create */
@Override
public Fragment getItem(int index) {

    System.out.println("getItem = "+index);
    Bundle data = new Bundle();
    data.putInt("current_page", index + 1);

    CommonFragment fragment = getFragment(index);

    fragment.setArguments(data);

    return fragment;
}


public CommonFragment getFragment(int index) {
    CommonFragment fragment = null;
    if(fragment == null){
        if(index == 0){
            fragment = new MySummaryFragment();
        }else if(index == 1){
            fragment = new FragmentOne();
        }else if(index == 4){
            fragment = new FragmentFour();
        }else if(index == 5){
            fragment = new FragmentFive();
        }else{
            fragment = new MyFragment();
        }
    }
    return fragment;
}

/** Returns the number of pages */
@Override
public int getCount() {
    return titles.length;
}

@Override
public CharSequence getPageTitle(int position) {
    return titles[position];
}

}

person Thiru    schedule 08.01.2013    source источник


Ответы (2)


pagerAdapter.getItem(selectedIndex) фактически создает новый экземпляр фрагмента.

См. этот ответ: https://stackoverflow.com/a/23843743/1271907

Вы должны сохранить ссылку на фактический фрагмент.

person Robby Smet    schedule 30.01.2015

Похоже, вы вызываете неправильный метод накачки.

Попробуйте изменить эту строку:

mView = inflater.inflate(R.layout.my_page_fragments, null);

to:

mView = inflater.inflate(R.layout.my_page_fragments,container, null);
person Marco RS    schedule 09.01.2013