Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use default animations in Android?

I'm trying to use the default animations for the Activity with fragments.. here I found something about it:

Android: using Activity's default animation for Fragments

the problem is: ok, I need (for example) "activityOpenEnterAnimation".. how can I use it?

Using the following code won't work:

        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.setCustomAnimations(android.R.anim.activityOpenEnterAnimation, android.R.anim.activityOpenExitAnimation);

        transaction.replace(R.id.container, fragment)
                .addToBackStack(((Object) fragment).getClass().getName())
                .commit();

Hints? Thanks! :)

like image 995
Filnik Avatar asked Mar 27 '14 15:03

Filnik


3 Answers

Nowadays, Android documentation clearly recommends not to use resources directly from android.R.*, since every release of the platform has changes on them. Even some resources dissapear from one version to another, so you shouldn't rely on them. On the other hand, lots of resources are private and not available from a developer's code.

The safest (and recommended) way is to simply copy & paste the resources you need (in this case, the animations) from the source code of the Android version you want into your own code, and use them through the regular R.*.

You can browse the Android source code in many ways, as explained in [1].

[1] Where can I find Android source code online?

like image 129
thelawnmowerman Avatar answered Oct 18 '22 20:10

thelawnmowerman


I managed to get it to work this way:

static public int getResourceIdFromCurrentThemeAttribute(FragmentActivity activity, int attribute){
    TypedValue a = new TypedValue();
    activity.getTheme().resolveAttribute(attribute, a, false);
    return a.resourceId;
}

//This type of fragment will be opened like an activity
static public void openActivityLikeFragment(FragmentActivity activity, BaseFragment fragment, int containerId, String stackRef) {
    FragmentManager fm = activity.getSupportFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    //The fragment open/close transition should have the same animations as its activity
    ft.setCustomAnimations(
            getResourceIdFromCurrentThemeAttribute(activity, android.R.attr.activityOpenEnterAnimation),
            getResourceIdFromCurrentThemeAttribute(activity, android.R.attr.activityOpenExitAnimation),
            getResourceIdFromCurrentThemeAttribute(activity, android.R.attr.activityCloseEnterAnimation),
            getResourceIdFromCurrentThemeAttribute(activity, android.R.attr.activityCloseExitAnimation)
    );
    ft.replace(containerId, fragment);
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    ft.addToBackStack(stackRef);
    ft.commit();
}

This solution is safer than directly referencing a resource, since its referencing an attribute which won't change without some deprecation warnings first.

like image 40
Ricardo Freitas Avatar answered Oct 18 '22 20:10

Ricardo Freitas


example of using default android animation when back pressed happen

 @Override
public void onBackPressed() {
    super.onBackPressed();
    overridePendingTransition(android.R.anim.fade_in,android.R.anim.fade_out);
}

for using default animations you should use android.R.anim.ANIMATIONNAME

like image 27
saigopi.me Avatar answered Oct 18 '22 22:10

saigopi.me