Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Orientation changes prevent the Crouton queue to be displayed correctly. #24

Closed
keyboardsurfer opened this issue Sep 18, 2012 · 14 comments
Labels
Milestone

Comments

@keyboardsurfer
Copy link
Owner

If there are a few Croutons within the queue and the device's orientation changes, all Croutons that have not yet been displayed will not be displayed.

Also Croutons that get added to the queue will not be displayed until the pre-orientation change queue has been fully processed.

This issue exists since the initial version of Crouton.

@ghost ghost assigned keyboardsurfer Sep 18, 2012
@keyboardsurfer
Copy link
Owner Author

A workaround is to call Crouton.clearCroutonsForActivity(this); within onDestroy of your activity like so:

  protected void onDestroy() {
    Crouton.clearCroutonsForActivity(this);
    super.onDestroy();
  }

@SebastianEngel
Copy link

Concerning the workaround: If I create and show a Crouton (default usage) in a Fragment, should I anyway use the onDestroy() method of the activity or the one of the fragment?

@keyboardsurfer
Copy link
Owner Author

If you show it within the Fragment, calling it in the Fragment's onDestroy() is the best solution.

@SebastianEngel
Copy link

If by "show it" you mean calling the "show()" method, yes I do it in the fragment. But if you mean where I show it in the layout hierarchy, I am not sure.

I call the following from within my fragment:

Crouton.makeText(getSherlockActivity(), "...", Style.ALERT).show();

Since I do not attach the crouton to a certain view of the fragment layout explicitly, I guess it is attached onto the activity. Therefore I ask myself if the fragment's or the activity's "onDestroy()" should be used. Does it depend on where "show()" was called from (activity or fragment), or to which view (activity, or explicit view in fragment layout) the crouton is attached to?

@keyboardsurfer
Copy link
Owner Author

Sorry, my answer was not clear. If you have attached a Crouton to a Fragment's ViewGroup you want to call Crouton.clearCroutonsForActivity(getActivity());.

It does not matter where the show() method is being called, but only where your Crouton is attached.

@chrisjenx
Copy link
Contributor

Please remember as of HC3.2+ orientation changes do not destroy and recreate activities. So although this may be a work around pre 3.2. It probably wont work on newer devices.

@SebastianEngel
Copy link

Thanks a lot.

@keyboardsurfer
Copy link
Owner Author

Using ActivityLifecycleCallbacks solves the issue for API 14+.

@alosdev
Copy link

alosdev commented Oct 30, 2013

  1. you should hold a weak reference to the activity and when it is destroyed, to can remove them.
  2. Check the queue if the croutons is context sensitive, so crouton on top, which cannot be displayed should be ignored and the next should be handled.

@someonestolemyusername
Copy link

In my testing, I found that calling Crouton.cancelAllCroutons(); is very important. I had an Android app running on 2.3 Genymotion, and if I opened a crouton then clicked a button that opened a web site, the phone would navigate back out of the web browser into the app to display the crouton finishing animation where it pops back up and disappears.

@keyboardsurfer
Copy link
Owner Author

That sounds rather odd. I have not ever experienced something like this. Does it happen with Android versions higher than Gingerbread as well?

@dotfeng
Copy link

dotfeng commented Nov 19, 2014

when startActivity(), better to use

@Override
protected void onStop() {
    super.onStop();
    Crouton.clearCroutonsForActivity(this);
}

@emezias
Copy link

emezias commented Feb 13, 2015

Note there is a Concurrency issue when following this direction. If placed in onDestroy, Crouton.cancelAllCroutons() can cancel any croutons that are supposed to be showing in the next activity. Better advice is to clear for the activity, as above and save CancelAll for an application ending action

@keyboardsurfer
Copy link
Owner Author

See README for further info.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

7 participants