Fragment-Transaktionen mit übergang - Einzigartige transitionNames erforderlich sind
Möchte ich von einer list view, um die detail-Ansicht und daher verwende ich die folgende OnClickListener
in meiner Liste:
@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();
}
Meine Funktionen zurück, die eindeutige Namen, ich habe zwei unterschiedliche Ansichten, aber trotzdem funktioniert es nicht.
Ich schon sagte, nicht benötigte Funktionen aus und schrieb einige eindeutige Transaktions-Namen in dort von hand... Aber trotzdem bekomme ich diese exception in der Zeile des ersten addSharedElement
:
java.lang.IllegalArgumentException: Unique transitionNames are required for all sharedElements
at android.support.v4.app.BackStackRecord.addSharedElement
BEARBEITEN
Ohne gemeinsame Elemente, alles funktioniert einwandfrei...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist, dass
addSharedElement
NICHT den Namen der Transaktion von der Aussicht!Also in meinem Beispiel würde ich haben, um es mit folgenden code:
BEVOR Sie diese Ansichten, um die
FragmentTransaction
...Anschließend folgende funktioniert gut und wie erwartet:
transitionName
genau gleich SharedElement name. Es ist genug, um die Ansicht nur eintransitionName
. Eigentlich SharedElement name MUSS gleichtransitionName
von shared-element in die Ziel-fragment. Siehe hier. Obwohl diese beidentransitionName
s erforderlich sein können, um gleich zu sein (bei einigen anderen Gründen), ist aber keine Voraussetzung um zu verhindern, dass der Einzigartige transitionNames sind erforderlich Fehler.Sie müssen den gleichen transitionName in der xml-layout-element jedes fragment. Zum Beispiel:
Fragment A:
Fragment B:
Und der code so etwas wie dieses:
Müssen Sie nur legen Sie eine
transitionName
zu Ihrem gemeinsame element. Es gibt keine Notwendigkeit für Sie es genau gleich, um den Namen Ihres gemeinsame element (wurde übergeben, als zweites argument deraddSharedElement()
- Methode).Dieser name (zweiter parameter von
addSharedElement()
) MUSS gleichtransitionName
des gemeinsame element in der Ziel-fragment. Sehen hier.So es ist genug, um einfügen:
vor dem Aufruf
addSharedElement(...)
.bevor onClick
verwenden Sie diesen code
Wenn Ihr
onClickListener
ist Teil Ihres fragment, nicht ElternActivity
, dann bist du etwas falsch hier. Ihr fragment sollte Benachrichtigen übergeordnete Aktivität, was es will und Activty sollte sich mit ihm beschäftigen (d.h. durch den Austausch Fragmente etc). Fragment sollte dies nie tun, von selbst. Auch wenn alles, was Sie brauchen, ist zu gehen, von der detail-Ansicht auf Liste, dann nehme ich Sie in Ihr detail-Ansicht in der Liste. Wenn dem so ist, ist alles was Sie brauchen, um pop-letztes element (fragment anzeigen-fragment) aus back-stack. Siehe: https://developer.android.com/reference/android/app/FragmentManager.html