android-target-tooltip icon indicating copy to clipboard operation
android-target-tooltip copied to clipboard

Loses the position on device orientation

Open githubsaturn opened this issue 8 years ago • 2 comments

Simply rotate the device while showing the tooltip and observe the tooltip position will be wrong after orientation change.

githubsaturn avatar Mar 23 '16 20:03 githubsaturn

Anyone any thought?

githubsaturn avatar Apr 18 '16 16:04 githubsaturn

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.

stevenlam48 avatar Aug 11 '16 22:08 stevenlam48