天天看点

android共享元素动画失效,Android共享元素片段过渡:返回过渡不起作用

在我的项目中,我使用RecyclerView来显示带有缩略图的项目列表。 当用户单击某个项目时,DetailView将被打开,图像显示在顶部。 我正在尝试在这些片段之间共享一些元素,但是过渡仅在输入明细片段时有效,而从其返回时不起作用。

在我的ListAdapter中,设置TransitionName并在用户单击项目时通知ListFragment:

@Override

public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

viewHolder.image.setTag(Constants.SHARED_NAME_IMAGE + item.itemId);

}

点击事件:

@OnClick(R.id.root)

public void onClickedItem() {

List> sharedElements = new ArrayList<>();

sharedElements.add(new Pair(image, (String) image.getTag()));

interactionListener.onItemSelected(data.get(getAdapterPosition() - headerItemCount).type, data.get(getAdapterPosition() - headerItemCount).itemId, sharedElements);

}

然后在ListFragment中,我启动DetailFragment:

public void navigateToFragment(Fragment curFragment, Fragment nextFragment,

boolean addToBackStack, List> 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 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();

}

}

最后,我在DetailFragment的onCreateView()中设置当前的过渡名称(因为它取决于itemId):

ViewCompat.setTransitionName(header, Constants.SHARED_NAME_IMAGE + itemId);

我刚刚解决了这个问题:有两个问题:

我已覆盖列表适配器(因此过渡名称已删除)

我尚未在onBindViewHolder中设置转换名称

为了解决1号问题,我像这样更改了setUpList(){...}(第一个如果重要的话!):

private void setupList() {

if (adapter != null) {

list.setAdapter(adapter);

linearLayoutManager = new LinearLayoutManager(getActivity());

list.setLayoutManager(linearLayoutManager);

setScrollListener();

return;

}

refreshLayout.setColorSchemeColors(ResourcesCompat.getColor(getResources(), R.color.main_color_2, getActivity().getTheme()));

refreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {

@Override

public void onRefresh() {

loadList(true);

}

});

adapter = new ListAdapter((int) (DisplayUtils.getWidth(getActivity()) * 0.6), this);

list.setAdapter(adapter);

linearLayoutManager = new LinearLayoutManager(getActivity());

list.setLayoutManager(linearLayoutManager);

refreshLayout.post(new Runnable() {

@Override

public void run() {

refreshLayout.setRefreshing(true);

loadFilterItems();

要解决#2,我只是将setTag(..)替换为setTransitionName(..)

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

vh.image.setTransitionName(Constants.SHARED_NAME_IMAGE + item.itemId);

}

在我的onClick方法中:

List> sharedElements = new ArrayList<>();

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

sharedElements.add(new Pair(image, image.getTransitionName()));

}

interactionListener.onItemSelected(data.get(getAdapterPosition() - headerItemCount).type, data.get(getAdapterPosition() - headerItemCount).itemId, sharedElements);