Подождите, пока закончится анимация другого вида

У меня есть следующий фрагмент раскладки:

    <LinearLayout
        android:id="@+id/tagContainer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:animateLayoutChanges="true" >

    </LinearLayout>

    <TextView
        android:id="@+id/commentLabel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/tagContainer" />

Как вы можете видеть, animateLayoutChanges установлен на true на LinearLayout, поэтому, когда элемент добавляется к нему, он оживляет добавление. Это нормально, но есть проблемы с удалением. Если я удаляю элемент, анимация по-прежнему хорошо воспроизводится, но ниже TextView появляется и не ждет завершения анимации. Как я могу достичь этого, или даже лучше, сделать анимацию TextView синхронизированной с анимацией LinearLayout?

Ответ 1

Вы можете получить LayoutTransition из вида следующим образом:

mLinearLayout = findViewById(R.id.myLayout);
LayoutTransition layoutTransition = mLinearLayout.getLayoutTransition();
layoutTransition.addTransitionListener(new TransitionListener(){

            @Override
            public void endTransition(LayoutTransition arg0, ViewGroup arg1,
                    View arg2, int arg3) {
                switch(arg2.getId()){
                                //....
                                }
            }

            @Override
            public void startTransition(LayoutTransition transition,
                    ViewGroup container, View view, int transitionType) {
                switch(view.getId()){
                                //....
                                }

            }});

Ответ 2

Это не ответ, а готовый к использованию фрагмент кода, который вы можете попытаться проверить, что происходит.

mContainer = (ViewGroup) v.findViewById(R.id.container);
if (Build.VERSION.SDK_INT >= 11) {
    mLayoutTransition = mContainer.getLayoutTransition();

    if (mLayoutTransition != null) {
        mLayoutTransition.addTransitionListener(new LayoutTransition.TransitionListener() {

            @Override
            public void startTransition(LayoutTransition transition, ViewGroup container, View view, int transitionType) {
                Log.d("\n\n startTransition: in "+container+" view "+view+" type "+ descr(transitionType));
            }

            @Override
            public void endTransition(LayoutTransition transition, ViewGroup container, View view, int transitionType) {
                Log.d("\n\n endTransition: in "+container+" view "+view+" type "+ descr(transitionType));
            }

            String descr(int transitionType) {
                String[] m = new String[]{"CHANGE_APPEARING","CHANGE_DISAPPEARING","APPEARING","DISAPPEARING"};
                return "" + transitionType + ": " + m[transitionType&3] + " changing="+( transitionType&LayoutTransition.CHANGING);
            }
        });
    }
}

Для меня представление контейнера представляет собой LinearLayout, и интересующее событие:

public void endTransition(LayoutTransition transition, ViewGroup container, View view, int transitionType) { // UI thread
    if (transitionType == LayoutTransition.DISAPPEARING) {
        // start 2nd animation, it will be done while another view is moved
    }
}