2016-05-27 15 views
10

Ho la seguente situazione all'interno di un'applicazione di calcio.
Vogliamo implementare gli elementi condivisi tra tutte queste attività.Elementi condivisi multipli

Shared Elements Situation

Nella mia viewholder al primo Activity per la partita ho impostato un android:transitionName che corrisponde allo stesso transitionName sul secondo Activity.

<!-- 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" /> 

avvio il secondo Activity con

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()); 

Ora questa transizione funziona bene, ma cosa succede se voglio avere un dettaglio ancora più profondo.
Visualizzazione delle statistiche sulla squadra selezionata e voglio anche avere una transizione condivisa?

Ho provato a impostare il transitionName a livello di codice quando è stato fatto clic su CustomViewContainingImageViewAndTextView sul nuovo transitionName.

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()); 

questo transitionName corrisponde alla ImageView al terzo 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" /> 

Tuttavia l'enterTransition fallisce, ma l'exitTransition funziona!
Tuttavia questo interrompe l'uscita Transizione da 2 -> 1

Vista. Spero che qualcuno impieghi del tempo per capirlo.

Grazie in anticipo

risposta

8

Al di là di ogni dubbio, il problema è perché si sta modificando transitionName del parere che si desidera condividere dal secondo Activity a terzi. Ma si dovrebbe semplicemente tenere che transitionName nel secondo Activity ma cambiare transitionName della vista nella terza onCreate metodo s'Activity, in base a ciò che vogliamo condividere dal secondo Activity.

Quindi manteniamo la transizione dal primo Activity al secondo, poiché funziona come previsto. Diamo un'occhiata alla seconda Activity: abbiamo solo bisogno di inviare la transitionName di vista, che vogliamo condividere come un extra di Intent al terzo Activity e quindi assegnare questo valore a livello di codice alla visione condivisa in terza Activity.

ecco il codice del nostro secondoActivity:

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); 

Quindi quello che ho fatto qui è appena creato lo stesso OnClickListener per entrambe le squadre, che crea la transizione condiviso, e inizia una nuova attività con Intent avere transitionName della vista condivisa come extra.

E poi nel terzo Activity ho appena ottenere questo extra da Intent e impostarlo come un transitionName di vista comune:

@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); 
    } 
} 

E come risultato abbiamo qualcosa di simile (ho Usato esplodere transizione per vedere meglio la differenza tra le attività):

enter image description here

Speranza che aiuta ed esattamente la lo stesso quello che vuoi! :)

+0

Ehi amico! Mi piace la tua soluzione, tuttavia la mia imageView nella mia terza attività è in un frammento e in una panoramica di riciclaggio. Quindi dovrei dare il mio nome di transizione alla mia attività passarlo al mio frammento passarlo al mio adattatore passarlo al mio viewholder. Che fastidio ... – tim

+0

Sì, oppure puoi salvarlo in "SharedPreferences" o nel database e quindi estrarlo nel tuo 'ViewHolder' /' Adapter'. Oppure puoi impostarlo come una variabile 'static' da qualche parte. Oppure puoi anche impostarlo come campo nel tuo modello (ad esempio, la classe 'Team', sarebbe il modo più semplice) e poi estrarre in' onBindViewHolder'. Ad ogni modo, è necessario impostarlo in runtime, perché non si sa cosa sarebbe condiviso fino a quando non verrà cliccato :) – rom4ek

1

Ho avuto questo dubbio, ma ho la sensazione che la risposta sopra sia un po 'confusa. Per dirla semplicemente se hai più di un elemento condiviso da animare, puoi creare "Coppia" di Visualizza & transitionName quanto vuoi. Ecco un esempio di codice per questo:

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());