13

画面の一部を占めるフラグメントを表示するには、show/hideを使用します。何らかの理由で、フラグメントが表示されるとslide_in_leftアニメーションが再生されますが、フラグメントが非表示になっているとアニメーションがなく、フラグメントが消えるだけです。との両方にslide_in_leftアニメーションを使用してみましたが、これは役に立ちませんでした。コードをサポートパッケージにトレースすると、アニメーションが作成され、それを表示するためのコードが実行されます。(私は呼び出しを追跡しました)exitenter.hide

FragmentManager fm = _activity.getSupportFragmentManager();
Fragment fragment = fm.findFragmentById(R.id.my_fragment);
FragmentTransaction ft = fm.beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_left);
if (fragment.isHidden()) {
    ft.show(fragment);
    fragment.setUserVisibleHint(true);
} else {
    ft.hide(fragment);
}
ft.commit();

念のため、ここにslide_out_leftアニメーションのxmlがあります

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="0" android:toXDelta="-50%p"
        android:duration="@android:integer/config_mediumAnimTime"/>
    <alpha android:fromAlpha="1.0" android:toAlpha="0.0"
        android:duration="@android:integer/config_mediumAnimTime" />
</set>

編集:my_fragment問題は、Webビューを含む別のフラグメントと画面幅を共有 しているという事実に関係している可能性があります。my_fragmentに対して.showを実行すると、.showが表示され、水平線形レイアウト内でスペースを共有します(2つのフラグメントのそれぞれが占める画面幅は、重みパラメーターによって決まります)。

4

5 に答える 5

30

setCustomAnimations(int enter、int exit)の代わりにsetCustomAnimations(int enter、int exit、int popEnter、int popExit)を使用してみてくださいpopupbackstackを呼び出すときアニメーションは呼び出されません

于 2014-09-26T06:24:51.293 に答える
4

個人的には、これはフラグメントアニメーションのzPositionのバグです。

表示されるのは、新しいフラグメントが「表示」されていることです。これは、新しいフラグメントが現在のフラグメントの下にアタッチされているためです。

したがって、既存のフラグメントの「上から」フラグメントをアニメーション化しようとすると、何も起こっていないように見え、新しいフラグメントが「表示」されます。

私は多くの回避策を試しました。zPositionで遊んだり(ウィンドウにのみ影響し、レイアウトには影響しないため、フラグメントには影響しません)、onAnimationCreate()ルートレイアウトを前面に表示したり、アニメーションの開始と停止を行ったりします...何もしないようです。

したがって、現時点では、フラグメントトランジションの完全なカスタムアニメーションを作成せずに、現時点では少しバグがあります。

あなたは遊ぶ必要があるかもしれません。.add(Fragment)追加されるのを待ってから、古いフラグメントの削除を呼び出します.remove(Fragment)。これにより、新しいフラグメントが既存のフラグメントの上に物理的に配置されます。

于 2013-02-20T10:55:32.493 に答える
3

代わりにトランジションを使用してみてください。これが私のプロジェクトの例です。

private fun changeFragment(fragment: BaseFragment, addBackStack: Boolean) {
    // Set transitions
    fragment.enterTransition = Fade(Fade.IN).apply { duration = 800 }
    fragment.exitTransition = Slide(Gravity.TOP).apply { duration = 800 }
    // Your transaction below
    val fragmentTransaction = supportFragmentManager.beginTransaction()

    fragmentTransaction.replace(R.id.fragmentContainer, fragment)
    if (addBackStack) {
        fragmentTransaction.addToBackStack(fragment.javaClass.name)
    }
    fragmentTransaction.commit()
}

また、独自のトランジションを作成することもできます:https ://medium.com/@belokon.roman/custom-transitions-in-android-f8949870bd63

于 2019-04-23T07:11:09.823 に答える
2

私はそれが発生するのと同じ状況にあったと思います:

N個のフラグメントがあり、カスタムアニメーションが必要でしたが、フラグメントをリロードしたくなかったため、addandremoveまたはaを実行するreplaceことは解決策ではなく、show/hideを使用すると、2つのフラグメント間でアニメーションを同期できませんでした。

これを修正するには、フラグメントごとにFrameLayoutを使用する必要がありました。

ここにコードがあります。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout
        android:layout_above="@+id/main_bottom_navigation"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <FrameLayout
            android:id="@+id/library"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

        <FrameLayout
            android:id="@+id/search"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

        <FrameLayout
            android:id="@+id/discover"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

    </FrameLayout>

    <com.roughike.bottombar.BottomBar
        android:id="@+id/main_bottom_navigation"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_alignParentBottom="true"
        app:bb_tabXmlResource="@xml/main_bb_tabs"
        app:bb_inActiveTabColor="@color/taupegray"
        app:bb_activeTabColor="@color/green_apple"
        app:bb_showShadow="true"/>

</RelativeLayout>

次に、表示するフラグメントを制御します。

private void showFragment(BaseFragment fragment) {
    Animation animation = AnimationUtils.loadAnimation(this,
                R.anim.slide_in_from_right);

    if (fragment instanceof DiscoverFragment) {
        mDiscoverContainer.bringToFront();
        mDiscoverContainer.startAnimation(animation);

        return;
    }

    if (fragment instanceof LibraryFragment) {
        mLibraryContainer.bringToFront();
        mLibraryContainer.startAnimation(animation);

        return;
    }

    if (fragment instanceof SearchFragment) {
        mSearchContainer.bringToFront();
        mSearchContainer.startAnimation(AnimationUtils.loadAnimation(animation);

        return;
    }
}

キーはにありますbringToFront

お役に立てば幸いです。

于 2017-05-15T20:38:39.767 に答える
2
  supportFragmentManager.beginTransaction()
     .setCustomAnimations(R.anim.enter_slide_up, R.anim.exit_slide_down,R.anim.enter_slide_up, R.anim.exit_slide_down)
     .add(R.id.nav_host_fragment, fragment)
        .addToBackStack(BACK_STACK)
        .commit()
于 2021-04-19T11:52:33.863 に答える