public static ICharSequence Parse( Context context, List <IconFontDescriptorWrapper> iconFontDescriptors, string text, TextView target) { context = context.ApplicationContext; // Analyse the text and replace {} blocks with the appropriate character // Retain all transformations in the accumulator SpannableStringBuilder spannableBuilder = new SpannableStringBuilder(text); RecursivePrepareSpannableIndexes(context, text, spannableBuilder, iconFontDescriptors, 0); bool isAnimated = HasAnimatedSpans(spannableBuilder); if (isAnimated) { if (target == null) { throw new IllegalArgumentException("You can't use \"spin\" without providing the target TextView."); } if (!(target is IHasOnViewAttachListener)) { throw new IllegalArgumentException(target.GetType().Name + " does not implement " + "HasOnViewAttachListener. Please use IconTextView, IconButton or IconToggleButton."); } bool isAttached = false; var listener = new OnViewAttachListener(); listener.Attach += (s, e) => { isAttached = true; Runnable runnable = null; runnable = new Runnable(() => { if (isAttached) { target.Invalidate(); ViewCompat.PostOnAnimation(target, runnable); } }); ViewCompat.PostOnAnimation(target, runnable); }; listener.Detach += (s, e) => isAttached = false; ((IHasOnViewAttachListener)target).SetOnViewAttachListener(listener); } else { (target as IHasOnViewAttachListener)?.SetOnViewAttachListener(null); } return(spannableBuilder); }
public void SetOnViewAttachListener(OnViewAttachListener listener) { this.listener?.OnDetach(); this.listener = listener; if (ViewCompat.IsAttachedToWindow(view)) { listener?.OnAttach(); } }
public static ICharSequence Parse( Context context, List<IconFontDescriptorWrapper> iconFontDescriptors, string text, TextView target) { context = context.ApplicationContext; // Analyse the text and replace {} blocks with the appropriate character // Retain all transformations in the accumulator SpannableStringBuilder spannableBuilder = new SpannableStringBuilder(text); RecursivePrepareSpannableIndexes(context, text, spannableBuilder, iconFontDescriptors, 0); bool isAnimated = HasAnimatedSpans(spannableBuilder); if (isAnimated) { if (target == null) throw new IllegalArgumentException("You can't use \"spin\" without providing the target TextView."); if (!(target is IHasOnViewAttachListener)) throw new IllegalArgumentException(target.GetType().Name + " does not implement " + "HasOnViewAttachListener. Please use IconTextView, IconButton or IconToggleButton."); bool isAttached = false; var listener = new OnViewAttachListener(); listener.Attach += (s, e) => { isAttached = true; Runnable runnable = null; runnable = new Runnable(() => { if (isAttached) { target.Invalidate(); ViewCompat.PostOnAnimation(target, runnable); } }); ViewCompat.PostOnAnimation(target, runnable); }; listener.Detach += (s, e) => isAttached = false; ((IHasOnViewAttachListener)target).SetOnViewAttachListener(listener); } else { (target as IHasOnViewAttachListener)?.SetOnViewAttachListener(null); } return spannableBuilder; }
public void SetOnViewAttachListener(OnViewAttachListener listener) { if (_delegate == null) _delegate = new HasOnViewAttachListenerDelegate(this); _delegate.SetOnViewAttachListener(listener); }