android-target-tooltip
android-target-tooltip copied to clipboard
Loses the position on device orientation
Simply rotate the device while showing the tooltip and observe the tooltip position will be wrong after orientation change.
Anyone any thought?
You could store a reference to the currently displayed tooltipView, and onSaveInstanceState, save the id of the Tooltipview currently being displayed. Then, in onViewStateRestored, re-create the TooltipView from the saved id if it exists.
Something along the lines of:
View aView; // Anchor view
Tooltip.TooltipView currentTooltip; // reference to currently showing Tooltip
private static final int NO_TOOLTIP = -1;
private static final int TOOLTIP_ONE = 101; // id of tooltip 1
private static final int TOOLTIP_TWO = 102; // id of tooltip 2
private static final String TOOLTIP_RESUME_STATE = 101;
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_content);
aView = findViewById(R.id.anchor_view);
....
setTooltipOne();
}
...
// create and show your tooltip here
private void setTooltipOne() {
// set currentTooltip to the one you are showing
currentTooltip = Tooltip.make(this,
new Builder(TOOLTIP_ONE)
.anchor(aView, Gravity.BOTTOM)
.closePolicy(new ClosePolicy()
.insidePolicy(true, false)
.outsidePolicy(true, false), 3000)
.activateDelay(800)
.showDelay(300)
.text(R.string.hello_world)
.maxWidth(500)
.withArrow(true)
.withOverlay(true)
.typeface(mYourCustomFont)
.floatingAnimation(AnimationBuilder.DEFAULT)
.build()
).show();
}
private Tooltip.Callback tooltipCallback() {
return new Tooltip.Callback() {
@Override
public void onTooltipClose(Tooltip.TooltipView tooltipView, boolean b, boolean b1) {
currentTooltip = null; // reset the savedTooltip
setTooltipTwo();
}
@Override
public void onTooltipFailed(Tooltip.TooltipView tooltipView) {
}
@Override
public void onTooltipShown(Tooltip.TooltipView tooltipView) {
}
@Override
public void onTooltipHidden(Tooltip.TooltipView tooltipView) {
}
};
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (currentTooltip != null) {
// save the ID here and remove the tooltip
outState.putInt(TOOLTIP_RESUME_STATE, currentTooltip.getId());
currentTooltip.remove();
}
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
// check if a tooltip has been stored and recreate it
if (savedInstanceState != null) {
int savedTooltipId = savedInstanceState.getInt(TOOLTIP_RESUME_STATE, NO_TOOLTIP);
if (savedTooltipId != NO_TOOLTIP) {
switch (savedTooltipId) {
case(TOOLTIP_ONE) :
setTooltipOne();
break;
case(TOOLTIP_TWO):
setTooltipTwo();
break;
...
}
}
}
You could also more cleanly do the switch from within a single method, but this is just a general idea.