I have an Activity with two Action bar tabs with one fragment in each tab. Everything is working properly until a screen rotation. I have references to the fragments in my activity. If i call a method of the fragmet from my activity and that method call getActivity(), the getActivity() return null.
I don't know if i shouldn't have references to the fragments as member fields of my Activity class. If i can't keep that reference in the activity class, how can i get the values of some fields in the layout of a fragment.
Here is my activity class:
public class MyActivity extends ActionBarActivity implements ActionBar.TabListener {
private ViewPager viewPager;
private MyPagerAdapter pagerAdapter;
private ActionBar actionBar;
DetallesAvisoFragment fragment1;
DetallesPiezaFragment fragment2;
ActionMode actionMode;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edit_avisos);
actionBar = getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
viewPager = (ViewPager) findViewById(R.id.viewPager);
Intent intent = getIntent();
fragment1 = new Fragment1();
fragment2 = new Fragment2();
List<Fragment> fragmentList = new ArrayList<Fragment>();
fragmentList.add(fragment1);
fragmentList.add(fragment2);
pagerAdapter = new MyPagerAdapter(getSupportFragmentManager(), fragmentList);
viewPager.setAdapter(pagerAdapter);
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int i, float v, int i2) {
}
@Override
public void onPageSelected(int i) {
actionBar.setSelectedNavigationItem(i);
}
@Override
public void onPageScrollStateChanged(int i) {
}
});
actionBar.addTab(actionBar.newTab().setText("Frag1 Tab").setTabListener(this));
actionBar.addTab(actionBar.newTab().setText("Frag2 Tab").setTabListener(this));
}
@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
viewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
}
@Override
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
}
/**
* This method work properly until screen rotation
*/
public void getValues() {
String value1 = fragment1.getValueFromSomeField();
String value2 = fragment2.getValueFromOtherField();
}
}
The FragmentPagerAdapter class:
public class MyPagerAdapter extends FragmentPagerAdapter{
List<Fragment> fragmentList;
public MyPagerAdapter(FragmentManager fm, List<Fragment> fragments) {
super(fm);
fragmentList = fragments;
}
@Override
public Fragment getItem(int index) {
if (index >= fragmentList.size()) {
return null;
}
return fragmentList.get(index);
}
@Override
public int getCount() {
return fragmentList.size();
}
}
And my Fragment classes:
public class Fragment1 extends Fragment {
public Fragment1() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceBundle) {
return inflater.inflate(R.layout.fragment1_layout, container, false);;
}
public String getValueFromSomeField() {
TextView testView = (TextView) getActivity().findViewById(R.id.someField);
return testView.getText().toString();
}
}
public class Fragment2 extends Fragment {
public Fragment2() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceBundle) {
return inflater.inflate(R.layout.fragment2_layout, container, false);;
}
public String getValueFromSomeOtherField() {
TextView testView = (TextView) getActivity().findViewById(R.id.someOtherField);
return testView.getText().toString();
}
}
Note: I need support for SDK 8 so I have to use Fragments using the SupportLibrary