1

Fragment から Fragment への移行についてサポートが必要です。見つけることができるドキュメントがほとんどないため、適切に行う方法が明確ではありません。

映画のポスターを含む GridView があります。1 つのポスターをクリックすると、次のフラグメントに移動します。ポスターは共有要素であり、サイズが変更され (大きくなり)、画面を覆います。他の要素は、コンテンツの遷移に従ってフェードします。 .これは正しく動作します。

再入力トランジションを取得できません。戻るボタンを押している間、グリッド ビューの最初の要素が常に最初に表示され (コンテンツ トランジション (フェード) には従いません)、その後、他の要素がフェード インします。共有要素サイズ変更 (縮小) や他の要素の結合は行われません。他の要素と一緒にフェード インするため、コンテンツ トランジション スタイルに従います。ここに私のコードがあります:

NowShowingFragment.java には、画像付きのグリッドビューが含まれています

 @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);
    setHasOptionsMenu(true);
    Transition shared = TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.fade);
    shared.setDuration(2000);
    setExitTransition(shared);
}  

私の OnCreateView では、Picasso を使用して Web から画像を読み込みます。そのため、最初に Imageview からビットマップを抽出し、それを Activity に渡します。Activity は、表示する次のフラグメントに渡されます。終わり)。

 mGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            imageView = (ImageView) view.findViewById(R.id.gridImage);
            Drawable drawable = imageView.getDrawable();

            if (drawable instanceof BitmapDrawable) {
                bmp = ((BitmapDrawable) imageView.getDrawable()).getBitmap();
            } else {
                return;
            }
            imageView.setTransitionName("Poster" + position);
            mCallback.onArticleSelected(bmp, "Poster" + position, imageView);
        }
    });  

主な活動

 @Override
public void onArticleSelected(Bitmap bmp, String name, ImageView image) {

    NowShowingDetail newFragment = new NowShowingDetail();

    Transition shared=TransitionInflater.from(this).inflateTransition(android.R.transition.move);
    shared.setDuration(2000);
    Bundle args = new Bundle();
    args.putParcelable("Bitmap", bmp);
    args.putString("TransitionName", name);
    newFragment.setArguments(args);
    newFragment.setEnterTransition(shared);
    newFragment.setSharedElementEnterTransition(TransitionInflater.from(this).inflateTransition(R.transition.change_image_transform));

    getSupportFragmentManager().beginTransaction().replace(R.id.now_showing_fragment, newFragment).addToBackStack(null).addSharedElement(image, image.getTransitionName()).commit();

}  

NowShowingDetail では、これは古いフラグメントを置き換える新しいフラグメントです。共有要素を全画面表示するだけです。

 @Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.testlayout, container, false);
    ImageView imageView = (ImageView) rootView.findViewById(R.id.gridImage);

    Bundle arguments = getArguments();
    if (arguments != null) {
        Bitmap bitmap = arguments.getParcelable("Bitmap");
        imageView.setImageBitmap(bitmap);
        imageView.setTransitionName(arguments.getString("TransitionName"));

    }
    return rootView;
}  

change_image_transor.xml

<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
<changeImageTransform
    android:duration="2000"></changeImageTransform>
<changeBounds
    android:duration="2000"></changeBounds>
<changeTransform
    android:duration="2000"></changeTransform>


前もって感謝します。

編集:同じコードで、アクティビティ遷移メソッドに変更しました.これは問題なく動作します.フラグメント遷移の呼び出し方が間違っている可能性があると思います.あなたの意見に感謝します.

4

1 に答える 1

0

Fragments の Shared Element Exit および Re-enter トランジションがないことに気付きました。

@George Mount の投稿からの引用:

これらのトランジションはすべて、共有要素の出口と共有要素のリターン トランジションがないことを除いて、フラグメント トランジションで同じです。フラグメント遷移は、FragmentTransaction を使用して機能します。フラグメントを削除してからフラグメントを追加すると、トランジションがアクティブになります。Fragment を削除すると、アクティビティ トランジションのように操作するのは確かに困難です。代わりに、FragmentTransaction を開始する前に操作を行う必要があります。

https://halfthought.wordpress.com/2014/12/08/what-are-all-these-dang-transitions/から

だから私は Fragment トランジションは 1 つの方法だと思います。その場合、動作は期待どおりです。

他の誰かがより良い説明をするまで、これを受け入れたままにしておきます。

于 2015-03-20T04:59:27.223 に答える