Katharina
Katharina

Reputation: 1642

Animate fragments content before closing it

I am displaying a FrameLayout with some components inside a Fragment. In onCreateView(..) I am animating the content of the FrameLayout and everything works fine. Now I want to animate the content before closing the Fragment.

In my current solution I am overriding onBackPressed() in the parent Activity and then I'm calling the method onBackPressed() inside my Fragment and animating the content there. The problem with this solution is, that I want to inflate the Fragment from various activities and then this is not really a nice solution... Does anybody know a better approach?

Thanks for your help!

Note:

I also tried to override onCreateView() and onPause() but the animation is not shown if I start it in those methods

and the following method does not fulfill my requirements either as it animates the whole fragment and I want to animate the content

getActivity().getSupportFragmentManager()
            .beginTransaction()
            .setCustomAnimations(R.anim.slide_in_up, R.anim.slide_out_up, R.anim.slide_out_down, R.anim.slide_in_down)

Upvotes: 4

Views: 1183

Answers (3)

Akshay Ayyanchira
Akshay Ayyanchira

Reputation: 141

I wanted to perform sliding exit animation before dismissing the view/fragment. These are the steps I performed:

  1. I created a runnable task which can dismiss the current screen.
  2. Passed that runnable to animating view.
  3. Used view.postOnAnimationDelayed(runnable, 400) so that it can animate and execute the runnable after 400 milliseconds.
  4. Also I made sure that my animation duration is >= 400 so that the transition is smooth.

Below is a little bit altered version of code for idea.

I used view.postOnAnimationDelayed(runnable, 400) to

Dialog dialog = new Dialog(getActivity(), getTheme()) {
            @Override
            public void onBackPressed() {
                ParentFragment.this.onBackPressed();
                Runnable runnable = new Runnable() {
                    @Override
                    public void run() {
                        //Referencing this class in runnable
                        getInstance().dismiss();
                    }
                };
             
             //webView is the child view loaded on this fragment
             if(webView != null && webView.webViewClient != null) {
                webView.webViewClient.animateClose(webView, runnable);
             } else {
                super.dismiss();
             }
        };

function animateOnClose in webViewClient looked like this:

public void animateClose(final WebView view, Runnable runnable) {
  Animation anim = AnimationUtils.loadAnimation(getMainActivityContext(),
               animationResource);
        view.startAnimation(anim);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            view.postOnAnimationDelayed(runnable, 400);
            // you can also try view.postOnAnimation(runnable);
        } else {
            runnable.run();
        }
}

Upvotes: 1

savepopulation
savepopulation

Reputation: 11921

Maybe you can try to handle onBackPressed in your fragment like below:

    yourRootLayout.setFocusableInTouchMode(true);
    yourRootLayout.requestFocus();
    yourRootLayout.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {

            if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){
                animateMyViews();
                return true;
            }
            return false;
        }
    });

Upvotes: 2

Abbas
Abbas

Reputation: 3331

I think what you need is to notify the Fragment that you are about to destroy it.

A crude pseudocode might look like

myFragment.aboutToClose();

While in your Fragment's aboutToClose() method.

public void aboutToClose()
{
    //  Perform all the animations you want.
    //  Don't forget to add onAnimationEnd() call back.

    onAnimationEnd()
    {
        // Notify Activity that Animations have completed.
        callback.animationsCompleted();
    }
}

Finally in your calling Activity.

public void animationsCompleted()
{
    //  Destroy fragment.
    getActivity().getSupportFragmentManager()
        .beginTransaction()
        .setCustomAnimations(R.anim.slide_in_up, R.anim.slide_out_up, R.anim.slide_out_down, R.anim.slide_in_down);
}

Upvotes: 0

Related Questions