Понимание Window#getSharedElementTransition()

У меня есть два действия A и B, у которых есть SharedElement. Если Activity A запускает Activity B и прослушивает переход, вызываются оба слушателя для выхода и повторного входа.

Вот код вызова Activity A:

public class MainActivity extends AppCompatActivity {

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


        getWindow().getSharedElementReenterTransition().addListener(new Transition.TransitionListener() {
            @Override
            public void onTransitionStart(Transition transition) {
                Log.i("Log", "A REENTER");
            }

            ...
        });

        getWindow().getSharedElementExitTransition().addListener(new Transition.TransitionListener() {
            @Override
            public void onTransitionStart(Transition transition) {
                Log.i("Log", "A EXIT");
            }

           ...
        });

        getWindow().getSharedElementEnterTransition().addListener(new Transition.TransitionListener() {
            @Override
            public void onTransitionStart(Transition transition) {
                Log.i("TestApp", "A ENTER");


            }

            ...
        });
        getWindow().getSharedElementReturnTransition().addListener(new  Transition.TransitionListener() {
            @Override
            public void onTransitionStart(Transition transition) {
                Log.i("TestApp", "A RETURN");
            }

            ...
        });


    }

    public void onClick(View v){
        Intent intent = new Intent(this, Act2.class);
        Pair<View, String> pair1 = Pair.create(findViewById(R.id.textView), findViewById(R.id.textView).getTransitionName());
        ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(this, pair1);
        startActivity(intent, options.toBundle());
    }
}

Если я сейчас выполню onClick() (для запуска Activity B), а затем нажму кнопку «Назад», чтобы вернуться к Activity A, журнал будет выглядеть следующим образом:

A REENTER
A EXIT
B ENTER
B RETURN
B ENTER
B RETURN
A REENTER
A EXIT

я бы ожидал, что это будет

A EXIT
B ENTER
B RETURN
A REENTER

person AljoSt    schedule 24.07.2016    source источник


Ответы (2)


По умолчанию один и тот же переход используется как для выхода, так и для повторного входа, а также для входа и возврата. Если вы явно зададите их, они будут другими.

Я считаю, что вы добавляете слушателей в один и тот же переход, поэтому они все вызываются.

person George Mount    schedule 29.09.2016
comment
Большое спасибо. Несмотря на то, что я пару раз читал, что они одинаковы, если не заданы явно, я не предполагал, что будут вызываться оба слушателя. Кажется странным - person AljoSt; 30.09.2016

Я столкнулся с похожей проблемой и нашел похожий вопрос.

В Lollipop есть ошибка, из-за которой переход возврата к общему элементу прерывается, если он занимает больше времени, чем продолжительность перехода повторного ввода. Если вы отрегулируете продолжительность перехода при повторном входе (в вызывающем действии), это должно решить проблему прерывания.

Лучше использовать общие переходы элементов enter и return.

person Raymond Chenon    schedule 25.07.2016
comment
Мои переходы состоят не более чем из кода выше. Так что они не должны занимать много времени. Кроме того, как это поможет мне, если мне нужно иметь возможность делать разные вещи во время onExit и onReenter? [Я скорректировал исходный пост, чтобы предоставить больше информации. ] - person AljoSt; 27.07.2016