Java – Fragment activity reference after screen rotation

Fragment activity reference after screen rotation… here is a solution to the problem.

Fragment activity reference after screen rotation

I have an Activity that has two Action bar tabs with a fragment in each tab. Everything works fine until the screen rotates. I referenced fragments in my activity. If I call fragmet’s method from my activity and the method calls getActivity(), getActivity() returns null.

I

don’t know if I shouldn’t have a fragment reference as a member field of my Activity class. If I can’t keep that reference in the Activity class, how can I get the value of some field in the layout of the fragment.

This is my Activity lesson:

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();
    }
}

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 class:

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 SupportLibrary to use fragments

Solution

You declare

static final String STORE_FRAGMENT1 = "fragment1";
static final String STORE_FRAGMENT2 = "fragment2";

You override the onSaveInstanceState method to hold the labels fragment1 and fragment2;

@Override
protected void onSaveInstanceState(Bundle savedInstanceState) {
    if (fragment1 != null) {
        savedInstanceState.putString(STORE_FRAGMENT1,
                fragment1.getTag());
    }
    if (fragment2 != null) {
        savedInstanceState.putString(STORE_FRAGMENT2,
                fragment2.getTag());
    }

super.onSaveInstanceState(savedInstanceState);
}

When OnCreated you get the labels fragment1 and fragment 2 to save fragment1 and fragment2 before spinning

@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();
        ----edit-------

String TagFragment1;
        String TagFragment2;
        if (savedInstanceState != null) {
                    FragmentManager fm = getSupportFragmentManager();
            TagFragment1 = savedInstanceState.getString(STORE_FRAGMENT1);
            fragment1 = (SubjectFragment) fm
                    .findFragmentByTag(TagFragment1);
            TagFragment2 = savedInstanceState.getString(STORE_FRAGMENT2);
            fragment2 = (CircuitFragment) fm
                    .findFragmentByTag(TagFragment2);

}
        else {
            fragment1 = new Fragment1();
            fragment2 = new Fragment2();
        }
        ---end--edit-----
        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));
    }

Related Problems and Solutions