【问题标题】:IllegalStateException on fragment replace with animation片段替换为动画时出现 IllegalStateException
【发布时间】:2015-02-25 09:12:10
【问题描述】:

我在一个页面中使用了 3 个片段,当我单击其中一个片段时,另外两个片段会替换为另外两个片段。我想使用按钮之类的片段不是一个好习惯,但它对我有用。我使用 setCustomAnimations 方法为更改设置动画。当我在第一个动画结束之前第二次单击按钮时,就会出现我的问题。我遇到了这个异常:

java.lang.IllegalStateException: No activity
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1113)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1108)
        at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1917)
        at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1800)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:967)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1126)
        at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:739)
        at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1489)
        at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:454)
        at android.os.Handler.handleCallback(Handler.java:733)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:146)
        at android.app.ActivityThread.main(ActivityThread.java:5602)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
        at dalvik.system.NativeStart.main(Native Method)

这是我点击第三个片段时调用的代码:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();

if (currentBottomMenuState == BottomMenuStates.DEFAULT) {
    currentBottomMenuState = BottomMenuStates.RADIO;

    fragment1a = Fragment1a.newInstance(this, radioService.isPlaying());
    ft.setCustomAnimations(R.anim.slide_in_bottom, R.anim.slide_out_top);
    ft.replace(bottomMenuContainerResource1, fragment1a);
    if (radioService.isPlaying()) {
        fragment2a = Fragment2a.newInstance(this);
        ft.setCustomAnimations(R.anim.slide_in_top, R.anim.slide_out_bottom);
        ft.replace(bottomMenuContainerResource2, fragment2a);
    } else {
        fragment2b = Fragment2b.newInstance(this);
        ft.setCustomAnimations(R.anim.slide_in_top, R.anim.slide_out_bottom);
        ft.replace(bottomMenuContainerResource2, fragment2b);
    }
} else {
    currentBottomMenuState = BottomMenuStates.DEFAULT;
    ft.setCustomAnimations(R.anim.slide_in_top, R.anim.slide_out_bottom);
    ft.replace(bottomMenuContainerResource1, fragment1b);
    fragment2c = Fragment2c.newInstance(this,
            userManager == null || !userManager.isLoggedIn() ? getString(R.string.loginText) : userManager.getUserFullName());
    ft.setCustomAnimations(R.anim.slide_in_bottom, R.anim.slide_out_top);
    ft.replace(bottomMenuContainerResource2, fragment2c);
}

ft.commitAllowingStateLoss();

这里是slide_in_bottom.xml:

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="400"
    android:fromYDelta="100%"
    android:toYDelta="0%" />

如果需要,我可以提供更多信息。

【问题讨论】:

  • 放置slide_in_bottom.xml的代码
  • @Palak 我添加了代码,谢谢!
  • slide_in_bottom.xml 中的问题
  • 我猜在那种情况下有嵌套的片段。我有几个片段,但它们都在活动。所以我不使用 getChildFragmentManager。

标签: android android-fragments fragmenttransaction


【解决方案1】:

更改动画文件的代码

slide_in_bottom.xml

<?xml version="1.0" encoding="utf-8"?>
<set>
  <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:propertyName="translationY" 
    android:valueType="floatType"
    android:valueFrom="1280"
    android:valueTo="0" 
    android:duration="1000"/>
</set>

slide_out_top.xml

<?xml version="1.0" encoding="utf-8"?>
<set>
  <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:propertyName="translationY" 
    android:valueType="floatType"
    android:valueFrom="0"
    android:valueTo="-1280" 
    android:duration="1000"/>
</set>

【讨论】:

  • 我正在使用支持库,有什么方法可以将 objectAnimator 与支持库一起使用?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-03
相关资源
最近更新 更多