0

I make an application using bottombar library. I'm using

compile 'com.roughike:bottom-bar:2.0.2'

I have 5 fragment like this

public class EventFragment extends Fragment {
    private RecyclerView rcEvent;
    private EventAdapter mAdapter;
    private List<EventModel> mgridData;
    private LinearLayoutManager layoutManager;
    private SwipeRefreshLayout mSwipe;


    public EventFragment() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView= inflater.inflate(R.layout.fragment_event, container, false);

        mSwipe= (SwipeRefreshLayout) rootView.findViewById(R.id.swipeRefresh);

        rcEvent = (RecyclerView) rootView.findViewById(R.id.rv);
        layoutManager = new LinearLayoutManager(getActivity());
        rcEvent.setLayoutManager(layoutManager);
        mgridData = new ArrayList<>();
        mAdapter = new EventAdapter(getActivity(), mgridData);
        rcEvent.setAdapter(mAdapter);

        fetchData();

        mSwipe.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                fetchData();
                //mSwipe.setRefreshing(false);
            }
        });

        return rootView;
    }

    public void fetchData()
    {

        mSwipe.setRefreshing(true);

        apiData api= ApiClient.getClient().create(apiData.class);
        Call<EventResponse> call=api.GetEvent();
        call.enqueue(new Callback<EventResponse>() {
            @Override
            public void onResponse(Call<EventResponse> call, Response<EventResponse> response) {
                if(response.isSuccessful())
                {
                    EventResponse result=response.body();
                    Log.d("Event", "response = " + new Gson().toJson(result));
                    if(result !=null)
                    {
                        List<EventModel> eventResponse= result.getEventData();
                        if(eventResponse !=null)
                        {
                            for (EventModel eventRespon :eventResponse) {
                                mgridData.add(eventRespon);
                            }
                            RecyclerView.Adapter adapter = new EventAdapter(getActivity(), mgridData);
                            mAdapter.setListData(mgridData);
                            rcEvent.setAdapter(adapter);
                        }
                        mSwipe.setRefreshing(false);
                    }
                }
            }

            @Override
            public void onFailure(Call<EventResponse> call, Throwable t) {
                Toast.makeText((MainActivity)getActivity(), "Koneksi Ke Internet Gagal", Toast.LENGTH_SHORT).show();
                mSwipe.setRefreshing(false);
            }

        });
    }
}

MainActivity.Java

public class MainActivity extends AppCompatActivity {
    boolean doubleBackToExitPressedOnce = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //Declare Fragment
        final EventFragment eventFragment=new EventFragment();
        final BloodFragment bloodFragment=new BloodFragment();
        final MerchantFragment merchantFragment=new MerchantFragment();
        final StoreFragment storeFragment=new StoreFragment();
        final ProfileFragment profileFragment=new ProfileFragment();

        BottomBar bottomBar=(BottomBar) findViewById(R.id.bottomBar);
        bottomBar.setOnTabSelectListener(new OnTabSelectListener() {
            @Override
            public void onTabSelected(@IdRes int tabId) {
                if (tabId == R.id.tab_event) {
                    getSupportFragmentManager()
                            .beginTransaction()
                            .replace(R.id.contentContainer, eventFragment, eventFragment.getClass().getName())
                            .commit();
                }
                else if(tabId == R.id.tab_blood){
                    getSupportFragmentManager()
                            .beginTransaction()
                            .replace(R.id.contentContainer, bloodFragment, bloodFragment.getClass().getName())
                            .commit();
                }
                else if(tabId == R.id.tab_merchant){
                    getSupportFragmentManager()
                            .beginTransaction()
                            .replace(R.id.contentContainer, merchantFragment, merchantFragment.getClass().getName())
                            .commit();
                }
                else if(tabId == R.id.tab_store){
                    getSupportFragmentManager()
                            .beginTransaction()
                            .replace(R.id.contentContainer, storeFragment, storeFragment.getClass().getName())
                            .commit();
                }
                else if(tabId == R.id.tab_profile){
                    getSupportFragmentManager()
                            .beginTransaction()
                            .replace(R.id.contentContainer, profileFragment, profileFragment.getClass().getName())
                            .commit();
                }
            }
        });
    }

    @Override
    public void onResume() {
        super.onResume();
    }

    @Override
    public void onBackPressed() {
        if (doubleBackToExitPressedOnce) {
            super.onBackPressed();
            finish();
        }

        this.doubleBackToExitPressedOnce = true;
        Toast.makeText(this, "Please press BACK again to exit", Toast.LENGTH_SHORT).show();

        new Handler().postDelayed(new Runnable() {

            @Override
            public void run() {
                doubleBackToExitPressedOnce=false;
            }
        }, 2000);
    }
}

My problem is when I open another fragment before my first fragment loading finished, I will get an error. The error happened because when the process is finished, I'm in another fragment. So I want to make the fragment freeze when I open another fragment and resume the process when I open the fragment again. How can I implement it in my code?

mkrieger1
  • 19,194
  • 5
  • 54
  • 65
Nicky Apriliani
  • 321
  • 4
  • 25

1 Answers1

0

The solution is to save the original fragment state when opens the new one.

To save the fragment state you can use:

@Override  
public void onActivityCreated(Bundle savedInstanceState) {
  super.onActivityCreated(savedInstanceState);
  ...
  if (savedInstanceState != null) {
    //Restore the fragment's state here
  }
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

   //Save the fragment's state here
}`
João Marcos
  • 3,872
  • 1
  • 19
  • 14
  • What should i fill in there? Sorry i'm newbie. So, I need more explanation. what kind a code that I should use to save fragment and restore fragment? – Nicky Apriliani Mar 14 '17 at 16:54
  • You can see here: http://stackoverflow.com/questions/22505327/android-save-restore-fragment-state It helps u? – João Marcos Mar 16 '17 at 11:32