keyboardsurfer / Crouton

Context sensitive notifications for Android

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Orientation changes prevent the Crouton queue to be displayed correctly.

keyboardsurfer opened this issue · comments

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.

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

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

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?

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

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?

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.

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.

Thanks a lot.

Using ActivityLifecycleCallbacks solves the issue for API 14+.

  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.

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.

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

when startActivity(), better to use

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

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

See README for further info.