私のプロジェクトでは、RecyclerView
を使用してサムネイル付きアイテムのリストを表示しています。ユーザーが項目をクリックするとDetailViewが開かれ、画像が上部に表示されます。私はこのフラグメント間でいくつかの要素を共有しようとしていますが、は、詳細フラグメントを入力するときにのみ動作し、出力するときは動作しません。私ListAdapter
でAndroid共有要素フラグメントトランジション:リターントランジションが動作しない
私はTransitionName
を設定し、ユーザーがアイテムをクリックしたときListFragmentに通知:ListFragmentに私が始めてその後
@OnClick(R.id.root)
public void onClickedItem() {
List<Pair<View, String>> sharedElements = new ArrayList<>();
sharedElements.add(new Pair<View, String>(image, (String) image.getTag()));
interactionListener.onItemSelected(data.get(getAdapterPosition() - headerItemCount).type, data.get(getAdapterPosition() - headerItemCount).itemId, sharedElements);
}
:
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
viewHolder.image.setTag(Constants.SHARED_NAME_IMAGE + item.itemId);
}
クリックイベントDetailFragment:
public void navigateToFragment(Fragment curFragment, Fragment nextFragment,
boolean addToBackStack, List<Pair<View, String>> sharedElements) {
if (nextFragment == null) {
return;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && sharedElements != null && curFragment != null) {
// Setup transition on first fragment
curFragment.setSharedElementEnterTransition(TransitionUtil.getReturnTransition(this));
curFragment.setSharedElementReturnTransition(TransitionUtil.getEnterTransition(this));
curFragment.setEnterTransition(null);
curFragment.setExitTransition(null);
// Setup transition on second fragment
nextFragment.setSharedElementEnterTransition(TransitionUtil.getEnterTransition(this));
nextFragment.setSharedElementReturnTransition(TransitionUtil.getReturnTransition(this));
nextFragment.setEnterTransition(null);
nextFragment.setExitTransition(null);
// Add second fragment by replacing first
FragmentTransaction ft = getSupportFragmentManager()
.beginTransaction()
.replace(R.id.container, nextFragment);
if (addToBackStack) {
ft.addToBackStack("fragment");
}
for (Pair<View, String> sharedElement : sharedElements) {
ViewCompat.setTransitionName(sharedElement.first, sharedElement.second);
ft.addSharedElement(sharedElement.first, sharedElement.second);
}
// Apply the transaction
ft.commit();
} else {
FragmentTransaction ft = getSupportFragmentManager()
.beginTransaction()
.replace(R.id.container, nextFragment);
if (addToBackStack) {
ft.addToBackStack("fragment");
}
ft.commit();
}
}
最後に(それはのitemIdに依存する)私はDetailFragmentのonCreateView()
に現在のトランジション名を設定しています:
ViewCompat.setTransitionName(header, Constants.SHARED_NAME_IMAGE + itemId);