23

我想从列表视图转到详细视图,因此,我OnClickListener在列表中使用以下内容:

@Override
public void onClick(View view)
{
    Bet bet = (Bet)view.getTag();
    FragmentManager fm = getActivity().getSupportFragmentManager();
    BetDetailFragment f = BetDetailFragment.create(bet);
    String tag = f.getClass().getName();

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
    {
        setSharedElementReturnTransition(TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.move));
        f.setSharedElementEnterTransition(TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.move));
    }

    FragmentTransaction ft = fm.beginTransaction()
            .replace(R.id.frame_container, f, tag)
            .addToBackStack(tag);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
    {
        L.d(this, "TRANS: " + TransitionUtil.getTransitionNameBetLogo1(bet) + "|" + view.findViewById(R.id.ivLogo1));
        L.d(this, "TRANS: " + TransitionUtil.getTransitionNameBetLogo2(bet) + "|" + view.findViewById(R.id.ivLogo2));
        ft.addSharedElement(view.findViewById(R.id.ivLogo1), "1");//TransitionUtil.getTransitionNameBetLogo1(bet));
        ft.addSharedElement(view.findViewById(R.id.ivLogo2), "2");//TransitionUtil.getTransitionNameBetLogo2(bet));
    }
    ft.commit();
}

我的函数返回唯一的名称,我有两个不同的视图,但它仍然不起作用。我已经注释掉了不必要的函数,并在其中手动写了一些唯一的事务名称......但是,我仍然在第一行中得到了这个异常addSharedElement

java.lang.IllegalArgumentException: Unique transitionNames are required for all sharedElements
        at android.support.v4.app.BackStackRecord.addSharedElement

编辑

没有共享元素,一切都运行良好......

4

5 回答 5

54

问题是,它addSharedElement没有设置视图的事务名称!

因此,在我的示例中,我必须使用以下代码进行设置:

ViewCompat.setTransitionName(view.findViewById(R.id.ivLogo1), "1");
ViewCompat.setTransitionName(view.findViewById(R.id.ivLogo2), "2");

在我将此视图添加到FragmentTransaction...之前

之后以下工作正常且符合预期:

ft.addSharedElement(view.findViewById(R.id.ivLogo1), "1");
ft.addSharedElement(view.findViewById(R.id.ivLogo2), "2");
于 2015-06-16T16:06:47.253 回答
6

您必须在每个片段的 xml 布局元素中设置相同的 transitionName。例如:

片段 A:

<TextView
 android:id="@+id/my_text_view"
 ...
 android:transitionName="transtion_name_example"/>

片段 B:

<TextView
 android:id="@+id/my_text_view"
 ...
 android:transitionName="transtion_name_example"/>

代码将是这样的:

yourTransaction.addSharedElement(view, view.transactionName)
于 2018-09-16T15:54:01.197 回答
3

您只需将 a 设置transitionName为您的共享元素无需选择与共享元素的名称完全相同的名称(已作为addSharedElement()方法的第二个参数传递)。

此名称(的第二个参数addSharedElement())必须等于目标片段transitionName共享元素的名称。见这里


所以插入就足够了

ViewCompat.setTransitionName(view.findViewById(R.id.ivLogo1), "AnyThing");
ViewCompat.setTransitionName(view.findViewById(R.id.ivLogo2), "EveryThing");

在调用addSharedElement(...).

于 2018-07-21T23:35:42.083 回答
1

在点击之前

使用此代码

ViewCompat.setTransitionName(holder.ivImage, "value");
于 2017-10-30T13:30:49.187 回答
0

如果您onClickListener是片段的一部分,而不是 parent Activity,那么您在这里做错了。您的片段应该通知父活动它想要什么,而 Activty 应该处理它(即通过替换片段等)。片段不应该自己这样做。此外,如果您只需要从详细视图转到列表,那么我假设您从该列表输入了详细视图。如果是这样,您只需要从堆栈中弹出最后一个元素(片段视图片段)。请参阅:https ://developer.android.com/reference/android/app/FragmentManager.html

于 2015-06-15T14:53:07.997 回答