2016-05-27 3 views
10

У меня есть следующая ситуация внутри приложения для футбола.
Мы хотим реализовать общие элементы между всеми этими действиями.Несколько общих элементов

Shared Elements Situation

В моем viewholder на первом Activity на матч Я поставил android:transitionName, который соответствует одному и тому же transitionName на втором 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" /> 

я начинаю второй Activity с

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

Сейчас этот переход прекрасно работает, но что, если я хочу иметь еще более глубокую детализацию.
Отображение статистики о выбранной команде, и я тоже хочу иметь общий переход?

Я попытался установить transitionName программно, когда CustomViewContainingImageViewAndTextView был нажат на новый 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()); 

это transitionName соответствует ImageView на третьем 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" /> 

Однако enterTransition не удается, но exitTransition работает!
Однако это прерывает выход из перечня от 2 -> 1

Взгляд. Надеюсь, кому-то понадобится время, чтобы понять это.

Заранее спасибо

ответ

8

Вне всякого сомнения, проблема в том, что вы меняете transitionName мнение о том, что вы хотите поделиться со второго Activity до третьего. Но вы должны просто держать, что transitionName во втором Activity но изменить transitionName о представлении в третьего onCreate методаActivity «s, согласно тому, что мы хотим поделиться со второго Activity.

Итак, давайте продолжим переход от первого Activity к второму, так как он работает должным образом. Давайте посмотрим на второй Activity: нам просто нужно отправить transitionName зрения, что мы хотим поделиться в качестве дополнительной части Intent к третьей Activity, а затем присвоить это значение программно к общему мнению в третьем Activity.

Так вот код нашей второйActivity:

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

Так что я здесь только что создали такую ​​же OnClickListener для обеих команд, что создает общий переход, и начинает новую деятельность с Intent имея transitionName общего вида в качестве дополнительного.

А потом в третийActivity Я просто получить это дополнительное от Intent и установить его в качестве transitionName разделяемой зрения:

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

И в результате мы имеем что-то вроде этого (я имею б взрываются переход, чтобы лучше видеть разницу между деятельностью):

enter image description here

Надежда, что помогает и точно так то же самое, что вы хотите! :)

+0

Эй, парень! Мне нравится ваше решение, однако мой ImageView в моем третьем действии находится в фрагменте и в recyclerview. Поэтому я должен был бы передать свое имя перехода в свою деятельность, передав его моему фрагменту, передав его моему адаптеру, передав его моему наблюдателю. Какая проблема ... – tim

+0

Да, или вы можете сохранить его в 'SharedPreferences' или в базе данных, а затем извлечь его в свой' ViewHolder'/'Adapter'. Или вы можете установить его как переменную 'static' где-нибудь. Или вы даже можете установить его как поле в своей модели (т. Е. Класс 'Team', это будет самый простой способ), а затем извлечь его в' onBindViewHolder'. В любом случае, вам нужно установить его во время выполнения, потому что вы не знаете, что будет использоваться до тех пор, пока оно не будет нажато :) – rom4ek

1

У меня было это сомнение, но я чувствую, что ответ выше немного запутанный. Проще говоря, если у вас есть несколько общих элементов для анимации, вы можете создать «Pair» из View & transitionName столько, сколько хотите. Вот пример кода для этого:

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

 Смежные вопросы

  • Нет связанных вопросов^_^