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

Comments

Projects
None yet
7 participants
@keyboardsurfer
Owner

keyboardsurfer commented Sep 18, 2012

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

This comment has been minimized.

Show comment
Hide comment
@keyboardsurfer

keyboardsurfer Oct 13, 2012

Owner

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

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

keyboardsurfer commented Oct 13, 2012

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

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

This comment has been minimized.

Show comment
Hide comment
@SebastianEngel

SebastianEngel Apr 2, 2013

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?

SebastianEngel commented Apr 2, 2013

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

This comment has been minimized.

Show comment
Hide comment
@keyboardsurfer

keyboardsurfer Apr 2, 2013

Owner

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

Owner

keyboardsurfer commented Apr 2, 2013

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

@SebastianEngel

This comment has been minimized.

Show comment
Hide comment
@SebastianEngel

SebastianEngel Apr 2, 2013

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?

SebastianEngel commented Apr 2, 2013

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

This comment has been minimized.

Show comment
Hide comment
@keyboardsurfer

keyboardsurfer Apr 2, 2013

Owner

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.

Owner

keyboardsurfer commented Apr 2, 2013

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

This comment has been minimized.

Show comment
Hide comment
@chrisjenx

chrisjenx Apr 2, 2013

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.

Contributor

chrisjenx commented Apr 2, 2013

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

This comment has been minimized.

Show comment
Hide comment
@SebastianEngel

SebastianEngel Apr 2, 2013

Thanks a lot.

SebastianEngel commented Apr 2, 2013

Thanks a lot.

@keyboardsurfer

This comment has been minimized.

Show comment
Hide comment
@keyboardsurfer

keyboardsurfer Oct 17, 2013

Owner

Using ActivityLifecycleCallbacks solves the issue for API 14+.

Owner

keyboardsurfer commented Oct 17, 2013

Using ActivityLifecycleCallbacks solves the issue for API 14+.

@alosdev

This comment has been minimized.

Show comment
Hide comment
@alosdev

alosdev 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.

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

This comment has been minimized.

Show comment
Hide comment
@someonestolemyusername

someonestolemyusername Oct 31, 2014

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.

someonestolemyusername commented Oct 31, 2014

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

This comment has been minimized.

Show comment
Hide comment
@keyboardsurfer

keyboardsurfer Nov 2, 2014

Owner

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

Owner

keyboardsurfer commented Nov 2, 2014

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

@dotfeng

This comment has been minimized.

Show comment
Hide comment
@dotfeng

dotfeng Nov 19, 2014

when startActivity(), better to use

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

dotfeng commented Nov 19, 2014

when startActivity(), better to use

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

This comment has been minimized.

Show comment
Hide comment
@emezias

emezias 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

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

This comment has been minimized.

Show comment
Hide comment
@keyboardsurfer

keyboardsurfer Jun 5, 2015

Owner

See README for further info.

Owner

keyboardsurfer commented Jun 5, 2015

See README for further info.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment