web-dev-qa-db-ja.com

遷移を伴うフラグメントトランザクション-一意のtransitionNamesが必要です

リストビューから詳細ビューに移動したいので、リストで次の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();
}

私の関数は一意の名前を返します。2つの異なるビューがありますが、それでも機能しません。私はすでに不要な関数をコメントアウトし、そこにいくつかの一意のトランザクション名を手作業で書きました...しかし、それでも、最初のaddSharedElementの行で、この例外が発生します。

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

[〜#〜]編集[〜#〜]

共有要素がなければ、すべてが完全に正常に機能しています...

18
prom85

問題は、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");
45
prom85

各フラグメントの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)
3
ycesar

transitionName共有要素に設定するだけで済みます。 共有要素の名前と正確に同じものを選択する必要はありませんaddSharedElement()メソッドの2番目の引数として渡されます)。

この名前(addSharedElement()の2番目のパラメーター)は、共有要素transitionNameと等しくなければなりません宛先フラグメントここ を参照してください。


したがって、挿入するだけで十分です

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

addSharedElement(...)を呼び出す前。

2
Mir-Ismaili

onClickの前

このコードを使用する

ViewCompat.setTransitionName(holder.ivImage, "value");
1

onClickListenerが親Activityではなくフラグメントの一部である場合は、ここで間違ったことをしています。フラグメントは、親アクティビティに必要なものを通知し、Activtyはそれを処理する必要があります(つまり、フラグメントを置き換えるなど)。フラグメントは、これを単独で実行してはなりません。また、詳細ビューからリストに移動するだけの場合は、そのリストから詳細ビューを入力したと思います。その場合、必要なのは最後の要素(フラグメントビューフラグメント)をバックスタックからポップすることだけです。参照: https://developer.Android.com/reference/Android/app/FragmentManager.html

0
Marcin Orlowski