リストビューから詳細ビューに移動したいので、リストで次の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
[〜#〜]編集[〜#〜]
共有要素がなければ、すべてが完全に正常に機能しています...
問題は、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");
各フラグメントの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)
transitionName
を共有要素に設定するだけで済みます。 共有要素の名前と正確に同じものを選択する必要はありません( addSharedElement()
メソッドの2番目の引数として渡されます)。
この名前(addSharedElement()
の2番目のパラメーター)は、共有要素のtransitionName
と等しくなければなりません宛先フラグメント。 ここ を参照してください。
したがって、挿入するだけで十分です:
_ViewCompat.setTransitionName(view.findViewById(R.id.ivLogo1), "AnyThing");
ViewCompat.setTransitionName(view.findViewById(R.id.ivLogo2), "EveryThing");
_
addSharedElement(...)
を呼び出す前。
onClickの前
このコードを使用する
ViewCompat.setTransitionName(holder.ivImage, "value");
onClickListener
が親Activity
ではなくフラグメントの一部である場合は、ここで間違ったことをしています。フラグメントは、親アクティビティに必要なものを通知し、Activtyはそれを処理する必要があります(つまり、フラグメントを置き換えるなど)。フラグメントは、これを単独で実行してはなりません。また、詳細ビューからリストに移動するだけの場合は、そのリストから詳細ビューを入力したと思います。その場合、必要なのは最後の要素(フラグメントビューフラグメント)をバックスタックからポップすることだけです。参照: https://developer.Android.com/reference/Android/app/FragmentManager.html