2016-05-27 14 views
10

Ich habe die folgende Situation innerhalb einer Fußballanwendung.
Wir wollen die gemeinsamen Elemente zwischen all diesen Aktivitäten implementieren.Mehrere freigegebene Elemente

Shared Elements Situation

In meinem viewholder am ersten Activity für das Spiel ich ein android:transitionName gesetzt haben, die auf dem zweiten Activity auf den gleichen transitionName entspricht.

<!-- item_viewholder (first activity) --> 
<CustomViewContainingImageViewAndTextView 
    android:id="@+id/item_match_hometeam" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:transitionName="@string/transition_morph_match_header_homeTeam" /> 

<!-- header (second activity) --> 
<CustomViewContainingImageViewAndTextView 
    android:id="@+id/item_match_hometeam_header" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:transitionName="@string/transition_morph_match_header_homeTeam" /> 

Ich starte die zweiten Activity mit

final String awayTeamTransition = activityContext.getString(R.string.transition_morph_match_header_awayTeam); 
final String homeTeamTransition = activityContext.getString(R.string.transition_morph_match_header_homeTeam); 
final ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(
        activityContext, 
        Pair.create(homeTeam, homeTeamTransition), 
        Pair.create(awayTeam, awayTeamTransition)); 
activityContext.startActivity(intent, options.toBundle()); 

Jetzt dieser Übergang funktioniert gut, aber was ist, wenn ich ein noch tieferes Detail haben will.
Statistiken über das ausgewählte Team anzeigen und ich möchte auch dort den Übergang teilen?

Ich versuchte, die transitionName programmatisch einstellen, wenn die CustomViewContainingImageViewAndTextView auf die neue transitionName geklickt wurde.

final String teamViewTransition = activityContext.getString(R.string.transition_morph_teamview_to_detail); 
//teamView is the view that was clicked. 
ViewCompat.setTransitionName(teamView, teamViewTransition); 

final ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(
    activityContext, 
    Pair.create(teamView, teamViewTransition)); 
activityContext.startActivity(teamInfoActivityIntent, options.toBundle()); 

diese transitionName entspricht dem ImageView am dritten Activity

<ImageView 
    android:id="@+id/team_info_header_logo" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:transitionName="@string/transition_morph_teamview_to_detail" /> 

jedoch die enterTransition versagt, aber die exitTransition funktioniert!
Dies bricht jedoch den exitTransition von 2 -> 1

Sight. Hoffe jemand braucht etwas Zeit, um dies herauszufinden.

Vielen Dank im Voraus

Antwort

8

über jeden Zweifel erhaben ist das Problem, weil Sie transitionName der Ansicht ändern, die Sie von der zweiten Activity bis dritten teilen möchten. Aber Sie sollten einfach, dass transitionName in der zweiten Activity halten, aber in drittenActivity ‚s onCreate Methode transitionName der Ansicht ändern, je nachdem, was wir von der zweiten Activity teilen möchten.

Also lassen Sie uns unseren Übergang von ersten Activity zu zweiten, wie es funktioniert wie erwartet. Schauen wir uns die zweite Activity aussehen: wir müssen nur die transitionName Sicht senden, dass wir als Extra von Intent bis dritten Activity und weisen Sie dann diesen Wert programmatisch auf die gemeinsame Haltung in dritte Activity teilen möchten.

So, hier ist der Code unserer zweitenActivity:

View homeTeam = findViewById(R.id.home_team_detail); 
View awayTeam = findViewById(R.id.away_team_detail); 

View.OnClickListener onTeamClickListener = new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Activity activityContext = MultipleElementsDetail.this; 
     final ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(
       activityContext, 
       Pair.create(v, v.getTransitionName())); 
     startActivity(new Intent(activityContext, SingleElementDetail.class) 
      .putExtra("shared_element_transition_name", v.getTransitionName()), options.toBundle()); 
    } 
}; 

homeTeam.setOnClickListener(onTeamClickListener); 
awayTeam.setOnClickListener(onTeamClickListener); 

Also, was ich hier tat genau das gleiche OnClickListener für beide Teams geschaffen, die gemeinsam genutzte Übergang schafft, und startet neue Aktivität mit Intent mit transitionName der gemeinsamen Ansicht als ein Extra.

Und dann in drittenActivity Ich habe nur bekommen diese zusätzliche von Intent und legen Sie es als transitionName der gemeinsamen Ansicht:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_single_element_detail); 

    View team = findViewById(R.id.team_single); 

    String transitionName = getIntent().getStringExtra("shared_element_transition_name"); 
    if (!TextUtils.isEmpty(transitionName)) { 
     ViewCompat.setTransitionName(team, transitionName); 
    } 
} 

Und als Ergebnis wir etwas davon haben (ich habe gebrauchter Übergang explodiert, um besser den Unterschied zwischen den Aktivitäten zu sehen):

enter image description here

Hoffnung, das und genau das hilft der das gleiche was du willst! :)

+0

Hey Mann! Ich mag Ihre Lösung, aber meine ImageView in meiner dritten Aktivität ist in einem Fragment und in einer Recyclerview. Ich müsste also meinen Transitionsnamen meiner Aktivität geben, sie an mein Fragment übergeben, an meinen Adapter übergeben und an meinen Viewholder übergeben. Was für ein Ärger ... – tim

+0

Ja, oder Sie können es in 'SharedPreferences' oder in der Datenbank speichern und dann in Ihrem' ViewHolder'/'Adapter' extrahieren. Oder Sie können es irgendwo als "statische" Variable setzen. Oder Sie können es sogar als ein Feld in Ihrem Modell (d. H. "Team" -Klasse, es wäre der einfachste Weg) und dann wieder in "onBindViewHolder" extrahieren. Wie auch immer, Sie müssen es in Runtime setzen, weil Sie nicht wissen, was geteilt wird, bis es geklickt wird :) – rom4ek

1

Ich hatte diesen Zweifel selbst, aber ich fühle mich wie die Antwort oben ist ein bisschen verwirrend. Um es einfach zu sagen, wenn Sie mehr als ein gemeinsam genutztes Element zum Animieren haben, können Sie "Paar" von Ansicht & transitionName so oft erstellen wie Sie wollen. Hier ist ein Beispielcode dafür:

Pair statusAnim = Pair.create(holder.getOrderStatusView(), "track_job_status"); 
    Pair driverBundleAnim = Pair.create(holder.getDriverProfileBundle(), "driver_profile_bundle"); 
    ActivityOptions transitionActivityOptions = ActivityOptions.makeSceneTransitionAnimation((Activity) context, statusAnim, driverBundleAnim); 
    context.startActivity(new Intent(context, TrackingActivity.class), transitionActivityOptions.toBundle());