There are multiple Help Icons, and I want that If I click on any Help Icon, tooltips for this help icon only appeared and disappeared the open ones, because now, multiple tooltips can be open at a same time.
According to your description, you want to make one ToolTip appear when you click one helpicon, then click to make ToolTip disappear?
You want to use TapGestureRecognizer to achieve it, but you have already implement TooltipEffect that call click event. It is seems a issue in Xamarin, more details can be found here
But I see the sample have implement ITipListener, you can click ToolTip to make ToolTip disappear, don't need to use TapGestureRecognizer
class TipListener : Java.Lang.Object, ITipListener
{
public void OnTipDismissed(Android.Views.View p0, int p1, bool p2)
{
}
}
Update:
You have implemented xamarin.forms.view click event in PlatformEffect, it block TapGestureRecognizer. Can not find way to fire TapGestureRecognizer, but I find one workaround that you can take a look.
You can use LongClick to make ToolTip appear and use Click to make ToolTip disappear.
protected override void OnAttached()
{
var control = Control ?? Container;
control.LongClick += OnTap;
control.Click += HideTooltip;
}
private void HideTooltip(object sender, EventArgs e)
{
var control = Control ?? Container;
_toolTipsManager.FindAndDismiss(control);
}
protected override void OnDetached()
{
var control = Control ?? Container;
control.LongClick -= OnTap;
control.Click -= OnTap;
_toolTipsManager.FindAndDismiss(control);
}
Update again:
You can see I have add control.LongClick += OnTap; and control.Click += HideTooltip; on OnAttached method, it is same as LongPressedCommand, the article that you provided, its ultimate goal is to add longclick.
[assembly: ResolutionGroupName("CrossGeeks")]
[assembly: ExportEffect(typeof(DroidTooltipEffect), nameof(TooltipEffect))]
namespace ToolTipSample.Droid.Effects
{
public class DroidTooltipEffect : PlatformEffect
{
ToolTip toolTipView;
ToolTipsManager _toolTipsManager;
ITipListener listener;
public DroidTooltipEffect()
{
listener = new TipListener();
_toolTipsManager = new ToolTipsManager(listener);
}
void OnTap(object sender, EventArgs e)
{
var control = Control ?? Container;
var text = TooltipEffect.GetText(Element);
if (!string.IsNullOrEmpty(text))
{
ToolTip.Builder builder;
var parentContent = control.RootView;
var position = TooltipEffect.GetPosition(Element);
switch (position)
{
case TooltipPosition.Top:
builder = new ToolTip.Builder(control.Context, control, parentContent as ViewGroup, text.PadRight(80, ' '), ToolTip.PositionAbove);
break;
case TooltipPosition.Left:
builder = new ToolTip.Builder(control.Context, control, parentContent as ViewGroup, text.PadRight(80, ' '), ToolTip.PositionLeftTo);
break;
case TooltipPosition.Right:
builder = new ToolTip.Builder(control.Context, control, parentContent as ViewGroup, text.PadRight(80, ' '), ToolTip.PositionRightTo);
break;
default:
builder = new ToolTip.Builder(control.Context, control, parentContent as ViewGroup, text.PadRight(80, ' '), ToolTip.PositionBelow);
break;
}
builder.SetAlign(ToolTip.AlignLeft);
builder.SetBackgroundColor(TooltipEffect.GetBackgroundColor(Element).ToAndroid());
builder.SetTextColor(TooltipEffect.GetTextColor(Element).ToAndroid());
toolTipView = builder.Build();
_toolTipsManager?.Show(toolTipView);
}
}
protected override void OnAttached()
{
var control = Control ?? Container;
control.LongClick += OnTap;
control.Click += HideTooltip;
}
private void HideTooltip(object sender, EventArgs e)
{
var control = Control ?? Container;
_toolTipsManager.FindAndDismiss(control);
}
protected override void OnDetached()
{
var control = Control ?? Container;
control.LongClick -= OnTap;
control.Click -= OnTap;
_toolTipsManager.FindAndDismiss(control);
}
class TipListener : Java.Lang.Object, ITipListener
{
public void OnTipDismissed(Android.Views.View p0, int p1, bool p2)
{
}
}
}
}