this is my project's construct,as show below: this is my project's construct
Fragment1 hava an viewpager to nest two child Fragment:A and B, Fragment2,3,4 both like this. Then Fragment A and B both hava refreshData() method to refresh data.Now Fragment1 hava a button to select city. I want to refresh Fragment A and B after change city.
But when I switch from Fragment1 to Fragment4 ,then switch back to Fragment1 and click button to change city , when call refreshData() ,the getActivity() method returned null ,so will show NullPointerException error .
that make me crazy.FragmentA and FragmentB both executed onCreateView, why getActivity() return null?
Fragment A code:
public class Fragment1 extends Fragment {
public Fragment1() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_fragment1, container, false);
}
public void refreshData(String city){
if ( null != getActivity()){
//get data from webservice
}
}
}
Fragment1.java :
private List<Fragmnet> mFragmentList;
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
mFragmentList = new ArrayList<>();
mFragmentList.add(new FragmentA());
mFragmentList.add(new FragmentB());
View v =inflater.inflate(R.layout.fragment_creadit, container, false);
viewPager = (ViewPager) v.findViewById(R.id.pager);
adapter = new ViewPagerAdapter(getResources(), getChildFragmentManager(),titleList,mFragmentList);
viewPager.setAdapter(adapter);
return v;
}
update:I know why getActivity() return null . That's because Fragment1 will show old fragmentA and FragmentB even you reexecute Fragment1's onCreateView() to add new FragmentA\b and change fragmentAdapter's data.
so i change the Fragment1's onCreateView() to :
List<Fragmnet> mFragmentList ;
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if( null == mFragmentList){
mFragmentList = new ArrayList<>();
mFragmentList.add(new FragmentA());
mFragmentList.add(new FragmentB());
}
View v =inflater.inflate(R.layout.fragment_creadit, container, false);
viewPager = (ViewPager) v.findViewById(R.id.pager);
adapter = new ViewPagerAdapter(getResources(), getChildFragmentManager(),titleList,mFragmentList);
viewPager.setAdapter(adapter);
return v;
}
so when i call refreshData() ,this is old FragmentA's refreshData() ,not the new FragmentA's .