8

表示/非表示を使用して、画面の一部を占めるフラグメントを表示します。何らかの理由で、フラグメントが表示されているときにはslide_in_leftのアニメーションが再生されますが、フラグメントが隠されているときにアニメーションが存在しない場合、フラグメントは消えます。私はslide_in_leftアニメーションをexitenterの両方に使用しようとしましたが、これは役に立ちませんでした。サポートパッケージにコードをトレースすると、アニメーションが作成され、それを表示するコードが実行されます。これは、問題はそのmy_fragment事実とは何かを持っている可能性があります :ここslide_out_leftアニメーション終了アニメーションが機能しません。 FragmentTransactionカスタムアニメーションが非表示のために機能しない

<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> 

を編集するためのXMLがあります念の

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(); 

(私は.hideコールをトレースし) Webビューを共有する別のフラグメントと画面幅を共有します。 my_fragmentのために.showが実行されると、それは可視になり、水平線形レイアウト内のスペースを共有します(2つのフラグメントのそれぞれがどれくらいの画面幅を占めるかは、weightパラメータによって決まります)。

+0

今のところ、2番目のフラグメントを最初のフラグメントの上に表示することでこの問題を回避しました(最初のものをパリティに覆う)。このようなレイアウトのシナリオでは、アニメーションは正常に動作します。 –

答えて

3

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

新しいフラグメントが現れているのは、現在のフラグメントの下に新しいフラグメントが添付されているためです。

したがって、既存のフラグメントの上にあるフラグメントをアニメーション化しようとすると、新しいものが現れても何も起きていないように見えます。

私はzPosition(レイアウトではなく、フラグメントには影響しません)を使って遊んでいます。onAnimationCreate()ルートレイアウトを正面にしたり、アニメーションを開始したり停止したりしても何もしないようです。

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

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

+0

サウンドはそう考えられますが、1つのフラグメントが他のフラグメントの上にあるレイアウトで、アニメーションが正常に動作する理由はあまり明確ではありません。フラグメントを表示するコードは同じままですので、このzPositionの問題はまだ有効ですか? WebViewフラグメントがコンテンツを再レンダリングする必要がないため、前述の回避策が好ましい方法であることが判明しました。 –

+0

アニメーションのさらなる経験から、私はこの種のバグがzPositionに起因することをますます発見しています。私のアプリにはこの機能/バグが含まれていませんが、私はあなたの答えを受け入れています。 –

+0

ありがとう@LeoK最近、私はFragmentsから、Squares Flowライブラリによく似たView + Controllerパターンを採用しています。とても柔軟です。 –

-4

私が代わりに.add

ft.replace(R.id.container, new MyFragment()); 
+0

replace()は、フラグメント間を切り替えるたびに新しいフラグメントを作成すると、ビューがリークする可能性があるため、悪い考えです。ビューはコンテキスト(アクティビティ)への参照を持ち、ガベージコレクションを取得しません。 –

17

の.replaceを使用して動作するように終了アニメーションを得ることができたが setCustomAnimations使用してみてください(int型入力し、int型の出口に、int型popEnter、int型popExit) の代わり setCustomAnimations(INT入力し、int型の出口) あなたは

+0

ありがとう、働いています – OWADVL

+0

これは、バックスタックをポップするときのアニメーションとは関係ありません。彼は出口のレイヤリングについて質問し、フラグメントのアニメーションを入力します –

1

と呼ばれることが文句を言わないpopupbackstack終了アニメーションを呼ぶとき、私はそれが起こると同じような状況だったと思う:

私はN個のフラグメントを持っていましたが、私はカスタムアニメーションを持っていましたが、フラグメントをリロードしたくないので、addremoveまたはreplaceは解決策ではなく、show/hideでアニメーションを同期できませんでした二つの断片の間。

これを修正するには、各フラグメントに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

であります!

+0

メソッドはどこですか?bringToFront? –

+0

このメソッドは、すべてのビューで既に実装されています。呼び出すだけです。 –

関連する問題