overridePendingTransition не работает, когда используется FLAG_ACTIVITY_REORDER_TO_FRONT - PullRequest
26 голосов
/ 08 января 2011

У меня есть два действия в стеке, чтобы показать их, я использую FLAG_ACTIVITY_REORDER_TO_FRONT.Пока все хорошо, проблема возникает, когда я хочу привести действие с анимацией, используя overridePendingTransition.

Intent i = new Intent(ActivityA.this, ActivityB.class);
i.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
ActivityA.this.startActivity(i);
overridePendingTransition(R.anim.transition_to_right, R.anim.transition_to_left);

Однако переход не отображается, если флаг не добавлен в намерение2) тогда нет проблем.

Можно ли вывести активность на передний план с анимацией?

Большое спасибо!

Ответы [ 8 ]

37 голосов
/ 30 ноября 2011

На самом деле правильным решением при использовании REORDER_TO_FRONT является вызов overridePendingTransition в методе onNewIntent () действия, которое вы собираетесь открыть.

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
}

замените вашими переходами.

Если вам нужно выборочно заменить переход, вы можете добавить дополнительный в своем намерении и проверить его в onNewIntent (), чтобы решить, что делать.

Это не подходит, если вы не знаете, какой переход будет открыт (например, если вы не указали его явно), но в противном случае это правильное решение.

34 голосов
/ 07 августа 2011

Я столкнулся с этой же проблемой.Хитрость заключается в том, чтобы переопределить переход в обратном вызове onResume ().

@Override
public void onResume() {
    super.onResume();
    overridePendingTransition(R.anim.transition_to_right, R.anim.transition_to_left);
}
4 голосов
/ 20 июля 2014

для меня решение состояло в том, чтобы убедиться, что он работает в потоке пользовательского интерфейса

runOnUiThread(new Runnable() {
            public void run() {
                startActivity(new Intent(ActivityOne.this, ActivityTwo.class));
                overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
            }
        });

        finish();
2 голосов
/ 04 января 2017

У меня такая же проблема.Я предлагаю вам проверить ваш AndroidManifest.xml, чтобы убедиться, что у ActivityA и ActivityB нет обоих установленных Theme.Translucent.NoTitleBar , эта тема содержит «android: windowIsTranslucent» = true, причина проблемы.

Надеюсь, это поможет вам.

2 голосов
/ 18 июля 2014

Вызов

overridePendingTransition(R.anim.transition_to_right, R.anim.transition_to_left);

после финиша ();у меня сработало закрывающее действие.

finish();
overridePendingTransition(R.anim.transition_to_right, R.anim.transition_to_left);

Это лучше, чем вызов onResume, потому что это делает действие более независимым от анимаций входа и выхода:

Вызов после завершения действия отправителя:

Операция A --- Войдите в Переход 1 (на A) ---> Операция B --- Войдите в Переход 2 (на B) ---> Операция C

Активность A <--- Выходной переход 1 (на B) --- Активность B <--- Выходной переход 2 (на C) --- Активность C </p>

Активность A --- Входной переход1 (на A) ---> Деятельность C --- Войдите в Переход 3 (на C) ---> Деятельность B

Деятельность A <--- Выйдите из Перехода 3 (на C) --- ДеятельностьC <--- Выходной переход 2 (на B) --- Упражнение B </p>

Вызов onResume активности получателя:

Действие A --- Ввести переход 1 (вкл. B) ---> Действие B --- Ввести переход 2 (вкл. C) ---> Действие C

Действие A <--- Введите переход 1 (на A) --- Действие B <--- Введите переход 2 (на B) --- Действие C </p>

Действие A --- Введите переход3 (на C) ---> Действие C --- Войдите в переход 2 (на B) ---> Действие B

Действие A <--- Войдите в переход 1 (на A) --- ДействиеC <--- введите переход 3 (на C) --- действие B </p>

Здесь анимация onResume всегда должна быть одинаковой независимо от того, какая это активность отправителя, вместо первого подхода, где вы можете настроитьанимация легко.

1 голос
/ 26 июля 2011

Мой коллега столкнулся с этой проблемой, и ему удалось решить ее, добавив к ней минимальный атрибут SDK (5 и более).

, так как эта функция была доступна начиная с API 5, принудительное использование более высокого уровня SDK помогло нам.

0 голосов
/ 13 декабря 2011

Я сделал что-то подобное и сделал следующее:

private Stack<String> stack;
ViewAnimator mViewAnimator;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mViewAnimator = new ViewAnimator(this);
    if (stack == null) stack = new Stack<String>();
    push("FirstStackActivity", new Intent(this, FirstStackActivity.class));
}

@Override
public void finishFromChild(Activity child) {
    pop();
}

@Override
public void onBackPressed() {
    pop();
}

public void push(String id, Intent intent) {
    Window window = getLocalActivityManager().startActivity(id, intent);
    if (window != null) {
        stack.push(id);
        View view = window.getDecorView();
        mViewAnimator.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_in));
        mViewAnimator.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_out));            
        mViewAnimator.addView(view);
        mViewAnimator.showNext();
        setContentView(mViewAnimator);
    }
}

public void pop() {
    if (stack.size() == 1) finish();
    if (stack.size() > 0) {
        LocalActivityManager manager = getLocalActivityManager();   
        Intent lastIntent = manager.getActivity(stack.peek()).getIntent();
        Window newWindow = manager.startActivity(stack.peek(), lastIntent);
        View view = newWindow.getDecorView();
        mViewAnimator.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_in));
        mViewAnimator.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_out));
        mViewAnimator.showPrevious();
        mViewAnimator.removeView(view);
    }
    destroy(stack.pop());
}


/**
 * BugFix official
 * @param id
 * @return
 */
public boolean destroy(String id) {
    final LocalActivityManager activityManager = getLocalActivityManager();
    if (activityManager != null) {
        activityManager.destroyActivity(id, false);
        try {
            final Field mActivitiesField = LocalActivityManager.class.getDeclaredField("mActivities");
            if (mActivitiesField != null) {
                mActivitiesField.setAccessible(true);
                @SuppressWarnings("unchecked")
                final Map<String, Object> mActivities = (Map<String, Object>) mActivitiesField.get(activityManager);
                if (mActivities != null) {
                    mActivities.remove(id);
                }
                final Field mActivityArrayField = LocalActivityManager.class.getDeclaredField("mActivityArray");
                if (mActivityArrayField != null) {
                    mActivityArrayField.setAccessible(true);
                    @SuppressWarnings("unchecked")
                    final ArrayList<Object> mActivityArray = (ArrayList<Object>) mActivityArrayField.get(activityManager);
                    if (mActivityArray != null) {
                        for (Object record : mActivityArray) {
                            final Field idField = record.getClass().getDeclaredField("id");
                            if (idField != null) {
                                idField.setAccessible(true);
                                final String _id = (String) idField.get(record);
                                if (id.equals(_id)) {
                                    mActivityArray.remove(record);
                                    break;
                                }
                            }
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return true;
    }
    return false;
}
0 голосов
/ 08 января 2011

Как насчет создания анимации в onCreate () или onStart () второго действия.

...