1

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.

Zbarcea Christian
  • 9,367
  • 22
  • 84
  • 137
  • Check out my post over here ...http://stackoverflow.com/questions/20488497/the-fragment-which-is-got-from-backstack-call-oncreateview-again/20488663#20488663 . Check out for BaseContainerFragment.java class that handles your fragment transaction over here ...http://stackoverflow.com/questions/18120510/dynamically-changing-the-fragments-inside-a-fragment-tab-host/19859871#19859871 – AndroidHacker Dec 20 '13 at 12:40

0 Answers0