Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 片段自定义动画在棒棒糖中不起作用_Android_Android Fragments - Fatal编程技术网

Android 片段自定义动画在棒棒糖中不起作用

Android 片段自定义动画在棒棒糖中不起作用,android,android-fragments,Android,Android Fragments,我有下面的代码来设置片段的进入和退出动画 final FragmentManager manager = getSupportFragmentManager(); final FragmentTransaction ft = manager.beginTransaction(); ft.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_o

我有下面的代码来设置片段的进入和退出动画

final FragmentManager manager = getSupportFragmentManager();
final FragmentTransaction ft = manager.beginTransaction();
    ft.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right);
    ft.replace(R.id.container, fragment, tag);
    ft.addToBackStack(tag);
    ft.commitAllowingStateLoss();
在左.xml中滑动

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android">

    <translate android:fromXDelta="-100%"
    android:toXDelta="0%"
    android:duration="@integer/slide_anim_duration" />

</set>

对所有其他动画使用相同的方法。在所有其他版本中都可以正常工作,但问题只存在于棒棒糖中。当我们查看函数时
setCustomAnimations(int-enter、int-exit、int-popEnter、int-popExit)

enter
exit
工作正常,但是
pocenter
popeexit
在棒棒糖中失败。
请告诉我哪里出了问题,并提供一个兼容的解决方案,可以从Android2.3到5.1运行

更新:


仔细观察,似乎动画在那里,但持续时间没有影响。

您还可以在所有片段中尝试使用CreateAnimator..或它们正在扩展的基本片段

@target_api 20 or higher

@Override
    public Animator onCreateAnimator(int transit, boolean enter, int nextAnim) {
        if (enter) {
            return AnimatorInflater.loadAnimator(getActivity(), R.animator.slide_in_top);
        } else {
            return AnimatorInflater.loadAnimator(getActivity(), R.animator.fade_out);
        }
    }
注意以上两个动画师都是预定义的,R是android.R

希望这有帮助
干杯

片段动画甚至在L之前就已中断-更改屏幕方向时存在一些问题

下面的解决方案修复了L问题和早期的方向更改问题。将其用作基本片段类

公共抽象类AnimatedSupportFragment扩展了DaggerFragment{
私有静态最终字符串状态\u ENTER\u ANIM=“STATE\u ENTER\u ANIM”;
私有静态最终字符串STATE\u EXIT\u ANIM=“STATE\u EXIT\u ANIM”;
私有静态最终字符串状态\u POP\u ENTER\u ANIM=“STATE\u POP\u ENTER\u ANIM”;
私有静态最终字符串STATE\u POP\u EXIT\u ANIM=“STATE\u POP\u EXIT\u ANIM”;
私有静态最终字符串状态\u更改\u配置=“状态\u更改\u配置”;
私有@AnimRes int-mEnter=0;
私有@AnimRes int mExit=0;
私有@AnimRes int mpoppenter=0;
私有@AnimRes int mPopExit=0;
私有布尔值mIsChangingConfigurations=false;
public void setCustomAnimations(@AnimRes int enterAnim,
@存在的动物,
@流行动漫,
@动物与动物){
门特=肠内营养素;
mExit=exitAnim;
mPopEnter=爆米花;
mPopExit=popExitAnim;
}
@在创建时覆盖公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
如果(savedInstanceState!=null){
mEnter=savedInstanceState.getInt(STATE\u ENTER\u ANIM);
mExit=savedInstanceState.getInt(STATE\u EXIT\u ANIM);
mpopener=savedInstanceState.getInt(STATE\u POP\u ENTER\u ANIM);
mPopExit=savedInstanceState.getInt(STATE\u POP\u EXIT\u ANIM);
mIsChangingConfigurations=savedInstanceState.getBoolean(状态改变配置);
}
}
@覆盖SaveInstanceState上的公共void(束超出状态){
super.onSaveInstanceState(超出状态);
超出状态。输入(状态、输入、输入);
outState.putInt(州、出口、出口);
outState.putInt(STATE\u POP\u ENTER\u ANIM,mpopener);
outState.putInt(州/市/区/出口/动画,mPopExit);
outState.putBoolean(状态改变配置、错误更改配置);
}
@重写公共void onResume(){
super.onResume();
错误配置=错误;
}
@重写公共void onPause(){
super.onPause();
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.HONEYCOMB){
mIsChangingConfigurations=getActivity().isChangingConfigurations();
}
}
@SuppressLint(“新API”)
@重写公共动画onCreateAnimation(int transit、布尔输入、int nextAnim){
//此实现修复了方向更改时丢失的过渡动画:
//@见http://stackoverflow.com/questions/8837408/fragment-lost-transition-animation-after-configuration-change
//@见https://code.google.com/p/android/issues/detail?id=25994&can=4&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars
if(Build.VERSION.SDK\u INT播放它!
anim=nextAnim;
}否则{
//动画可能丢失了以片段状态保存的动画。
//enter=我们将要玩popEnterAnim,在另一种情况下是popExitAnimation
anim=输入?mpoppenter:mPopExit;
}
如果(动画!=0){
返回AnimationUtils.loadAnimation(getActivity(),anim);
}
}捕获(异常忽略){}
返回null;
}
}

如果将持续时间设置为2000,您将看到动画,但我认为它太慢了。这是我的代码:



你可以减少持续时间,但你会看到更少的动画。

我找到了另一种解决方案,它制作的动画并不完全相同,但非常相似,与传统幻灯片相比,我更喜欢此动画这是我制作动画的代码:

     private Fragment fragment=new Fragment();
 private FragmentManager fragmentManager=getSupportFragmentManager();


private void replaceFragmentWithAnimation(){
    FragmentTransaction ft = fragmentManager.beginTransaction();
 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && fragment != null) {
            Slide slideLeft = new Slide(Gravity.RIGHT);
            slideLeft.setDuration(300);
            fragment.setExitTransition(slideLeft);
        }

        fragment = CalendarFragment.newInstance(selectedDays, plusMonths);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Slide slideRight = new Slide(Gravity.RIGHT);
            slideRight.setDuration(350);
            fragment.setEnterTransition(slideRight);

        } else {
           ft.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_right);
        }
        ft.replace(calendarDaysContFL.getId(), fragment);
        ft.commit();
    }

以下是工作解决方案: @jskierbi-answer的修改版本

import android.support.v4.app.Fragment;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;


/**
 * @author : Pedramrn@gmail.com Created on: 2016-02-19
 */
public class SupportBaseFragment extends Fragment {

private boolean mIsChangingConfigurations = false;
private static final String STATE_CHANGING_CONFIGURATIONS = "STATE_CHANGING_CONFIGURATIONS";

@Override
public void onResume() {
    super.onResume();
    mIsChangingConfigurations = false;
}

@Override
public void onPause() {
    super.onPause();
    mIsChangingConfigurations = getActivity().isChangingConfigurations();
}


@Override
public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) {
    if (mIsChangingConfigurations)
        return null;
    if (enter)
        return AnimationUtils.loadAnimation(getContext(), nextAnim == 0 ? R.anim.enter_pop : nextAnim);
    else
        return AnimationUtils.loadAnimation(getContext(), nextAnim == 0 ? R.anim.exit_pop : nextAnim);
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (savedInstanceState != null) {
        mIsChangingConfigurations = savedInstanceState.getBoolean(STATE_CHANGING_CONFIGURATIONS);
    }
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putBoolean(STATE_CHANGING_CONFIGURATIONS, mIsChangingConfigurations);
}
enter.xml

<?xml version="1.0" encoding="utf-8"?>
<set>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="@android:integer/config_mediumAnimTime"
        android:fromXDelta="100%"
        android:interpolator="@android:anim/decelerate_interpolator"
        android:toXDelta="0"/>
</set>

您是否尝试过其他动画来检查问题是否存在于左.xml中的特定
幻灯片中?此外,您是否在不同的设备上进行了测试?这个问题是在模拟器上发生的吗?@Ricardo是的,我用了这么多类似的动画。除了棒棒糖中的
popEnter
popExit
外,其他功能都可以正常工作。问题在于使用棒棒糖的设备。没有尝试emulator。我几乎有
<?xml version="1.0" encoding="utf-8"?>
<set>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="@android:integer/config_mediumAnimTime"
        android:fromXDelta="100%"
        android:interpolator="@android:anim/decelerate_interpolator"
        android:toXDelta="0"/>
</set>
<?xml version="1.0" encoding="utf-8"?>
<set>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="@android:integer/config_mediumAnimTime"
        android:fromXDelta="-100%"
        android:interpolator="@android:anim/decelerate_interpolator"
        android:toXDelta="0"/>
</set>
<?xml version="1.0" encoding="utf-8"?>
<set>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="@android:integer/config_mediumAnimTime"
        android:fromXDelta="0"
        android:interpolator="@android:anim/accelerate_interpolator"
        android:toXDelta="-100%"/>
</set>
<?xml version="1.0" encoding="utf-8"?>
<set>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="@android:integer/config_mediumAnimTime"
        android:fromXDelta="0"
        android:interpolator="@android:anim/accelerate_interpolator"
        android:toXDelta="100%"/>
</set>
getSupportFragmentManager()
                .beginTransaction()
                .setCustomAnimations(R.anim.enter, R.anim.exit,
                        R.anim.enter_pop, R.anim.exit_pop)
                .replace(R.id.fragment_container, myFancyFragment)
                .addToBackStack(null)
                .commit();