Как переключить активность без анимации в Android?

165

Как правильно использовать флаг Intent FLAG_ACTIVITY_NO_ANIMATIONв файле AndroidManifest? Я полагаю, что моя проблема тривиальна, но я не могу найти хорошего примера или решения.

    <intent-filter>
        <data android:name="android.content.Intent.FLAG_ACTIVITY_NO_ANIMATION" />
    </intent-filter>

Однако компилятор не сообщает об ошибке, но dataэто не правильно. Я просто хочу отключить анимацию в случае переключения между действиями. Я могу использовать getWindow().setWindowAnimations(0);в onCreate или onResume, но лучше использовать флаг, не так ли?

Я могу использовать также в коде:

    Intent intent = new Intent(v.getContext(), newactivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
    getContext().startActivity(intent);

Но я хочу использовать этот флаг в Android Manifest. Отключить анимацию также в случае возврата со второго занятия на первое.

woyaru
источник
Я нашел предложение использовать тему - определив анимацию ввода, выхода для действий или всего приложения. Может кто-нибудь дать мне больше информации об этом?
Woyaru

Ответы:

269

Вы можете создать стиль,

 <style name="noAnimTheme" parent="android:Theme">
   <item name="android:windowAnimationStyle">@null</item>
</style>

и установите его как тему для вашей деятельности в манифесте:

   <activity android:name=".ui.ArticlesActivity" android:theme="@style/noAnimTheme">
    </activity>

Вы также можете определить стиль для указания пользовательских анимаций входа и выхода. http://developer.android.com/reference/android/R.attr.html#windowEnterAnimation

Сантош
источник
Спасибо, это прекрасно работает, особенно для прозрачных / диалоговых тем, исключенных из недавних заданий с другим родством задач. Без этого анимация продолжала показывать очень странные результаты для открываемого диалога!
3c71
это больше не работает для Lollipop / Android 5.0?
Кение
У меня есть Android 5, и он работает для меня. Стиль моего приложения выглядит следующим образом: <style name = "AppTheme" parent = "Theme.AppCompat.Light.DarkActionBar"> <item name = "android: windowAnimationStyle"> @ null </ item> </ style>
eatyourgreens
Отлично работает и в 6.0. Отличный совет. Как я спрашиваю ниже, мне интересно, как отключить анимацию, которая происходит при * первом запуске приложения ... есть ли способ ?!
Толстяк
5
произойдет сбой, если вы расширите AppCompatActivity
Mike6679
191

Если ваш контекст является активностью, вы можете вызвать overridePendingTransition :

Вызовите сразу после одного из вариантов startActivity (Intent) или Finish, чтобы указать явную анимацию перехода, которую нужно выполнить дальше.

Итак, программно:

this.startActivity(new Intent(v.getContext(), newactivity.class));
this.overridePendingTransition(0, 0);
eshirazi
источник
Возможно ли сделать это через ADB тоже?
разработчик Android
@TalAngel overridePendingTransitionбыл добавлен на уровне API 5. Поэтому нет, он не работает на "каждой" версии Android, но я думаю, вы нацелены на более высокий уровень API, чем 5.
Бруно Биери
43

Попробуйте этот код,

this.startActivity(new Intent(v.getContext(), newactivity.class).addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION));
Бартломей Йончи
источник
1
Это действительно помогает при запуске деятельности из сервиса.
ДорогойДрув
24

Вы также можете просто сделать это во всех действиях, с которых вы не хотите переходить:

@Override
public void onPause() {
    super.onPause();
    overridePendingTransition(0, 0);
}

Мне нравится такой подход, потому что вам не нужно возиться со стилем вашей деятельности.


источник
Отличный совет. Интересно, как отключить анимацию, которая происходит при * первом запуске приложения ... есть ли способ ?!
Толстяк
@Fattie Переопределите метод onStart () вашей активности запуска и поместите в него тот же код.
Джавад Адил
4

Вот однострочное решение, которое работает так же низко, как и то, minSdkVersion 14которое вы должны вставить в себя res/styles.xml:

<item name="android:windowAnimationStyle">@null</item>

вот так:

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        ...
        <item name="android:windowAnimationStyle">@null</item>
    </style>
    ...
</resources>

Ура!

user1506104
источник
3

Линия в стиле темы работает нормально, но анимация заменяется белым экраном. Особенно на более медленном телефоне - это действительно раздражает. Итак, если вы хотите мгновенный переход - вы можете использовать это в стиле темы:

<item name="android:windowAnimationStyle">@null</item>
<item name="android:windowDisablePreview">true</item>
Владимир Демирев
источник
2

создать свой собственный стиль, перекрывающий Android: Theme

<style name="noAnimationStyle" parent="android:Theme">
    <item name="android:windowAnimationStyle">@null</item>
</style>

Затем используйте его в манифесте так:

<activity android:name=".MainActivity"
    android:theme="@style/noAnimationStyle">
</activity>
Goyo
источник
0

После начала намерения вы можете использовать этот код:

Intent intent = new Intent(Activity1.this, Activity2.class);
overridePendingTransition(0, 0);
intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
startActivity(intent);

Если используется, намерение будет работать без анимации или переходов

Faran
источник