0

I have three fragment and one activity. It works this way:

[activity]-> [MainFragment]->[MenuFragment]->[SignUpFragment]

When [SignUpFragment] is back pressed, the [MainFragment] is created twice.

I tried setRetaInInstance(true) and I checked savedInstanceState but I can not prevent [MainFragment] recreating.

This is my MainActivity:

public class MainActivity extends AppCompatActivity {

public Bundle mSavedInstanceState;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    mSavedInstanceState = savedInstanceState;

    setContentView(R.layout.activity_main);

    }

    @Override
    protected void onResume() {

    super.onResume();

    callMainFragment();

    }

    private void callMainFragment() {

    if (mSavedInstanceState == null) {

        FragmentManager manager = getSupportFragmentManager();

        FragmentTransaction transaction = manager.beginTransaction();

        transaction.replace(R.id.container_category, new MainFragment(), MainFragment.class.getSimpleName());

        transaction.addToBackStack(null);

        transaction.commit();

    }

}

 public ActionBar getMainActionBar(){

    ActionBar actionBar = getSupportActionBar();

    if (actionBar != null) {

        // Action Bar Display settings

        actionBar.setDisplayShowCustomEnabled(true);

        actionBar.setDisplayShowTitleEnabled(false);

        // Custom view inflater

        LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        // Custom layout view

        View viewActionBar = inflater.inflate(R.layout.action_bar, null);

        // Set custom view

        actionBar.setCustomView(viewActionBar);

        actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);

    }

    return actionBar;

}

This is my MainFragment:

    public class MainFragment extends BaseFragment implements AdapterView.OnItemClickListener, BuyersGuideCategoriesDelegate, View.OnClickListener {

private Bundle mSavedInstanceState;

private BuyersGuideCategoriesFragment mCategoriesFragment;

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    this.setRetainInstance(true);

}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    mSavedInstanceState = savedInstanceState;

        if (mSavedInstanceState == null) {

            mView = inflater.inflate(R.layout.fragment_main, container, false);

            // Call Grid View Buyers Guide Fragment

            mCategoriesFragment = new BuyersGuideCategoriesFragment();

            mCategoriesFragment.mGridViewDelegate = this;

            setIcons();

            setTitles();

            setTexts();

            initListView();

        }

    return mView;

}

@Override
public void onResume() {

    super.onResume();

    ImageView menu = (ImageView) ((MainActivity) getActivity()).getMainActionBar().getCustomView().findViewById(R.id.action_bar_menu_icon);

    menu.setOnClickListener(this);

}

@Override
public void onClick(View v) {

    if (mSavedInstanceState == null) {

        MainActivity activity = (MainActivity) getActivity();

        FragmentManager manager = activity.getSupportFragmentManager();

        FragmentTransaction transaction = manager.beginTransaction();

        transaction.replace(R.id.container_category, new MenuFragment(),MenuFragment.class.getSimpleName());

        transaction.addToBackStack(null);

        transaction.commit();

    }

}

}

This is my MenuFragment:

public class MenuFragment extends BaseFragment implements AdapterView.OnItemClickListener, View.OnClickListener {

private Bundle mSavedInstanceState;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    mSavedInstanceState = savedInstanceState;

    if (savedInstanceState == null) {

        mView = inflater.inflate(R.layout.fragment_menu, container, false);

        setMenuItemsListViewAdapter();

    }

    return mView;

}

  private void setMenuItemsListViewAdapter() {

    ListView menuItems = (ListView) mView.findViewById(R.id.list_menu_items);

    ListMenuItemsListViewAdapter adapter = new ListMenuItemsListViewAdapter(getContext(),getMenuItemNames());

    menuItems.setAdapter(adapter);

    menuItems.setOnItemClickListener(this);
}

 @Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

    switch ((String) parent.getAdapter().getItem(position)){

      case SIGN_UP:

            replaceFragment(R.id.container_category,new SignUpFragment(),SignUpFragment.class.getSimpleName());

            break;

    }

}

private void replaceFragment(int containerId,Fragment fragment, String fragmentTag){

    if (mSavedInstanceState == null){

        MainActivity activity = (MainActivity) getActivity();

        FragmentManager manager = activity.getSupportFragmentManager();

        FragmentTransaction transaction = manager.beginTransaction();

        transaction.replace(containerId,fragment,fragmentTag);

        transaction.addToBackStack(null);

        transaction.commit();

    }

}

@Override
public void onClick(View v) {

    switch (v.getId()){

        case R.id.menu_back_icon:

                replaceFragment(R.id.container_category, new MainFragment(),MainFragment.class.getSimpleName());

            break;

    }

}

}

And this is my SignUpFragment:

public class SignUpFragment extends BaseFragment implements View.OnClickListener{

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    if (savedInstanceState == null) {

        mView = inflater.inflate(R.layout.fragment_sign_up, container, false);
    }

    return mView;

}

}

EDIT 1: The MainFragment is recreated only when I return from SignUpFragment to MenuFragment. I am doing wrong using so many fragments? Should I use activity?

2 Answers2

1

When you are move between Fragments, call addToBackStack() :

FragmentTransaction ft = fragmentManager.beginTransation();
ft.replace( R.id.fragment, new MyFragment() ).addToBackStack( "ftransaction" ).commit();
Shanto George
  • 994
  • 13
  • 26
0

Create first Fragment:

FragmentTransaction ft = fragmentManager.beginTransation();
ft.add(R.id.container, new FirstFragment()).addToBackStack(null).commit();

Second:

FragmentTransaction ft = fragmentManager.beginTransation();
ft.replace(R.id.container, new SecondFragment()).addToBackStack(null).commit();

and Third:

FragmentTransaction ft = fragmentManager.beginTransation();
ft.replace(R.id.container, new ThirdFragment()).commit();
DevOma
  • 299
  • 1
  • 4
  • 17