具有转换的片段事务 - 需要唯一的transitionNames

pro*_*m85 18 android transition transactions fragment android-transitions

我想从列表视图转到详细视图,因此,我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();
}
Run Code Online (Sandbox Code Playgroud)

我的函数返回唯一的名称,我有两个不同的视图,但它仍然无法正常工作.我已经评论过不必要的函数并在那里写了一些独特的事务名称......但是,我仍然得到这个例外,在第一行addSharedElement:

java.lang.IllegalArgumentException: Unique transitionNames are required for all sharedElements
        at android.support.v4.app.BackStackRecord.addSharedElement
Run Code Online (Sandbox Code Playgroud)

编辑

没有共享元素,一切都工作得很好......

pro*_*m85 44

问题是,这addSharedElement不会设置视图的事务名称!

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

ViewCompat.setTransitionName(view.findViewById(R.id.ivLogo1), "1");
ViewCompat.setTransitionName(view.findViewById(R.id.ivLogo2), "2");
Run Code Online (Sandbox Code Playgroud)

在此之前我将这些观点添加到FragmentTransaction......

之后的工作正常并且符合预期:

ft.addSharedElement(view.findViewById(R.id.ivLogo1), "1");
ft.addSharedElement(view.findViewById(R.id.ivLogo2), "2");
Run Code Online (Sandbox Code Playgroud)


yce*_*sar 6

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

片段A:

<TextView
 android:id="@+id/my_text_view"
 ...
 android:transitionName="transtion_name_example"/>
Run Code Online (Sandbox Code Playgroud)

片段B:

<TextView
 android:id="@+id/my_text_view"
 ...
 android:transitionName="transtion_name_example"/>
Run Code Online (Sandbox Code Playgroud)

代码将是这样的:

yourTransaction.addSharedElement(view, view.transactionName)
Run Code Online (Sandbox Code Playgroud)