I am trying to find a way to replace fragments as fast as I can. The problem is with fragment recreation (inflating layout on recreation).
Why is this a bad idea?
private View view;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
if (view == null)
{
view= inflater.inflate(R.layout.fragment_one, container, false);
Log.e(TAG, "On create view !");
}
return view;
}
Or this variant:
User click on a tab from actionbar
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft)
{
// tab contains a tag with the name of the Fragment, in this case is FRAGMENT_ONE
TabDataHolder tdh = (TabDataHolder) tab.getTag();
replaceFragment(R.id.mainContent, tdh.fragmentTag);
}
Method for replacing fragment:
private void replaceFragment(int fragmentContainerId, String fragmentTag)
{
Log.e(TAG, "Replace fragment !");
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out);
ft.replace(fragmentContainerId, getFragment(fragmentTag), fragmentTag).commit();
}
Method which creates or returns an existing fragment
private Fragment getFragment(String fragmentTag)
{
Fragment fg = getFragmentManager().findFragmentByTag(fragmentTag);
if (fg == null)
fg = getFragmentFromStack(fragmentTag);
if (fragmentTag.equals(FRAGMENT_ONE))
{
if (fg == null)
{
fg = new FragmentOne();
addFragmentToStack(fg, fragmentTag, false);
Log.e(TAG, "Adding fg to stack !");
}
}
else
if (fragmentTag.equals(FRAGMENT_TWO))
{
if (fg == null)
{
fg = new FragmentTwo();
addFragmentToStack(fg, fragmentTag, false);
Log.e(TAG, "Adding fg to stack !");
}
}
else
if (fragmentTag.equals(FRAGMENT_THREE))
{
if (fg == null)
{
fg = new FragmentThree();
addFragmentToStack(fg, fragmentTag, false);
Log.e(TAG, "Adding fg to stack !");
}
}
else
if (fragmentTag.equals(FRAGMENT_FOUR))
{
if (fg == null)
{
fg = new FragmentFour();
addFragmentToStack(fg, fragmentTag, false);
Log.e(TAG, "Adding fg to stack !");
}
}
if (fg == null)
new NullPointerException("Fragment not found");
return fg;
}
Method which returns an existing fragment from the stack (ArrayList) by tag
private ArrayList<FragmentData> fragmentDataStack = new ArrayList<FragmentData>();
private Fragment getFragmentFromStack(String fragmentTag)
{
for (FragmentData fgd : fragmentDataStack)
{
if (fgd.getTag().equals(fragmentTag))
return fgd.getFragment();
}
return null;
}
public class FragmentData
{
private Fragment fragment;
private String tag;
public FragmentData (Fragment fragment, String tag)
{
this.fragment = fragment;
this.tag = tag;
}
public Fragment getFragment() {
return fragment;
}
public void setFragment(Fragment fragment) {
this.fragment = fragment;
}
public String getTag() {
return tag;
}
public void setTag(String tag) {
this.tag = tag;
}
}
Method which will add a Fragment to the stack. The last parameter is for deleting the old fragment and adding a new fragment
private void addFragmentToStack(Fragment fragment, String fragmentTag, boolean replaceIfExists)
{
if (replaceIfExists)
{
for (int i = 0; i < fragmentDataStack.size(); i++)
{
if (fragmentDataStack.get(i).getTag().equals(fragmentTag))
{
fragmentDataStack.set(i, new FragmentData(fragment, fragmentTag));
return;
}
}
}
fragmentDataStack.add(new FragmentData(fragment, fragmentTag));
}
I am not sure if this the right procedure for fast fragment replacement.